python - 迭代列表切片

标签 python loops iteration slice

我想要一个算法来迭代列表切片。切片大小在函数外部设置,可以不同。

在我看来是这样的:

for list_of_x_items in fatherList:
    foo(list_of_x_items)

有没有办法正确定义 list_of_x_items 或使用 python 2.5 的其他方式?


edit1:澄清“分区”和“滑动窗口”这两个术语听起来都适用于我的任务,但我不是专家。所以我会更深入地解释这个问题并添加到问题中:

fatherList 是我从文件中获取的多级 numpy.array。函数必须找到系列的平均值(用户提供系列的长度)对于平均我使用 mean() 函数。现在进行问题扩展:

edit2:如何修改你提供的函数来存储额外的项目并在下一个fatherList被提供给函数时使用它们?

例如,如果列表长度为 10, block 大小为 3,则存储列表的第 10 个成员并附加到下一个列表的开头。


相关:

最佳答案

如果你想将一个列表分成多个切片,你可以使用这个技巧:

list_of_slices = zip(*(iter(the_list),) * slice_size)

例如

>>> zip(*(iter(range(10)),) * 3)
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]

如果项目的数量不能被切片大小整除,并且你想用 None 填充列表,你可以这样做:

>>> map(None, *(iter(range(10)),) * 3)
[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, None, None)]

这是一个肮脏的小把戏


好的,我会解释它是如何工作的。解释起来会很棘手,但我会尽力而为。

先介绍一点背景:

在 Python 中,您可以将列表乘以这样的数字:

[1, 2, 3] * 3 -> [1, 2, 3, 1, 2, 3, 1, 2, 3]
([1, 2, 3],) * 3 -> ([1, 2, 3], [1, 2, 3], [1, 2, 3])

还有一个 iterator对象可以像这样被消费一次:

>>> l=iter([1, 2, 3])
>>> l.next()
1
>>> l.next()
2
>>> l.next()
3

zip函数返回一个元组列表,其中第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。例如:

zip([1, 2, 3], [20, 30, 40]) -> [(1, 20), (2, 30), (3, 40)]
zip(*[(1, 20), (2, 30), (3, 40)]) -> [[1, 2, 3], [20, 30, 40]]

zip 前面的 * 用于解压缩参数。您可以找到更多详细信息here . 所以

zip(*[(1, 20), (2, 30), (3, 40)])

实际上等价于

zip((1, 20), (2, 30), (3, 40))

但可以使用可变数量的参数

现在回到诀窍:

list_of_slices = zip(*(iter(the_list),) * slice_size)

iter(the_list) -> 将列表转换为迭代器

(iter(the_list),) * N -> 将生成对 the_list 迭代器的 N 引用。

zip(*(iter(the_list),) * N) -> 会将这些迭代器列表输入 zip。这反过来又会将它们分组为 N 个大小的元组。但由于所有 N 项实际上都是对同一个迭代器 iter(the_list) 的引用,因此结果将在原始迭代器上重复调用 next()

我希望这能解释清楚。我建议您使用更易于理解的解决方案。我只是想提及这个技巧,因为我喜欢它。

关于python - 迭代列表切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1335392/

相关文章:

python - python中多个上下文管理器的执行顺序

c - 是否有等效于倒带功能的功能,但仅适用于一个 token ?

c# - 循环迭代父节点,直到找到特定标签

algorithm - 如何在两个值之间递增和递减

Python如何求一个目录迭代的最小移动次数——爬虫

python - 如何使用 Python 创建完整的压缩 tar 文件?

python - 使用 zipfile 提取大文件

python - 确保在 Python 中捕获所有异常

python - 在循环内组合 numpy 数组

c++ - 使用迭代方法计算矩阵的行列式