每隔n次迭代做一些事情而不使用计数器变量

时间:2014-02-19 11:42:00

标签: python

我有一个包含100多个元素的可迭代列表。我希望在每个第10个可迭代元素之后做一些事情。我不想使用计数器变量。我正在寻找一些不包含计数器变量的解决方案。

目前我喜欢这个:

count = 0
for i in range(0,len(mylist)):
    if count == 10:
        count = 0
        #do something
    print i
    count += 1

我有什么办法可以省略反变量吗?

5 个答案:

答案 0 :(得分:30)

for count, element in enumerate(mylist, 1): # Start counting from 1
    if count % 10 == 0:
        # do something

使用enumerate。它是为此而构建的

答案 1 :(得分:7)

只是为了显示另一个选项...希望我能正确理解你的问题...切片会给你准确的列表元素,而不必遍历每个元素或保留任何枚举或计数器。请参阅Explain Python's slice notation

如果你想从第一个元素开始并从那一点获取每个第10个元素:

# 1st element, 11th element, 21st element, etc. (index 0, index 10, index 20, etc.)
for e in myList[::10]:
    <do something>

如果您想从第10个元素开始并从该点获取每个第10个元素:

# 10th element, 20th element, 30th element, etc. (index 9, index 19, index 29, etc.)
for e in myList[9::10]:
    <do something>

第二个选项(Python 2)的示例:

myList = range(1, 101)  # list(range(1, 101)) for Python 3 if you need a list

for e in myList[9::10]:
    print e  # print(e) for Python 3

打印:

10
20
30
...etc...
100

答案 2 :(得分:2)

for i in range(0,len(mylist)):
    if (i+1)%10==0:
        do something
     print i

答案 3 :(得分:2)

解决问题的另一种方法是在开始处理之前将iterable拆分为块。

grouper recipe正是这样做的:

from itertools import izip_longest # needed for grouper

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

您可以这样使用它:

>>> i = [1,2,3,4,5,6,7,8]
>>> by_twos = list(grouper(i, 2))
>>> by_twos
[(1, 2), (3, 4), (5, 6), (7, 8)]

现在,只需循环遍历by_twos列表。

答案 4 :(得分:0)

您可以使用范围循环以下列方式以10的倍数遍历mylist的长度:

for i in range(0,len(mylist), 10):
    #do something