迭代每个for循环迭代的列表

时间:2018-03-06 15:27:37

标签: python python-3.x list for-loop

我正在处理以下代码:

mylist = [1,2,3,4,5,6,7,8,9,10.....]
for x in range(0, len(mylist), 3):
    value = mylist[x:x + 3]
    print(value)

基本上,我一次在mylist中使用3个项目,代码比那个大,但我做了很多事情,他们从中返回一个值,然后它需要下一个来自mylist的3个项目,并一直执行到此列表的末尾。

但现在我遇到了问题,我需要确定每次迭代,但它们遵循一条规则:

第一个循环来自A,第二个循环来自B,第三个循环来自C. 当它到达第三个时,它从A开始,所以我想要做的是这样的事情:

mylist[0:3]来自A

mylist[3:6]来自B

mylist[6:9]来自C

mylist[9:12]来自A

mylist[12:15]来自B ......

最初的想法是实现从A到C的标识符,每次迭代它跳转到下一个标识符,但是当它到达C时,它会返回到A.

所以输出看起来像这样:

[1,2,3] from A
[4,5,6] from B
[6,7,8] from C
[9,10,11] from A
[12,13,14] from B
[15,16,17] from C
[18,19,20] from A.....

我的糟糕解决方案: 创建identifiers = [A,B,C]乘以mylist的len - > identifiers = [A,B,C]*len(mylist) 因此,A,B和C的数量与它需要识别的mylist数相同。然后在我的for循环中添加一个计数器,为自己添加+1并访问我的列表的索引。

mylist = [1,2,3,4,5,6,7,8,9,10.....]
identifier = ['A','B','C']*len(mylist)
counter = -1
for x in range(0, len(mylist), 3):

    value = mylist[x:x + 3]
    counter += 1
    print(value, identifier[counter])

但它太丑陋了,根本不快。有谁知道更快的方法吗?

4 个答案:

答案 0 :(得分:4)

循环,压缩和解压缩:

mylist = [1,2,3,4,5,6,7,8,9,10]

for value, iden in zip(mylist, itertools.cycle('A', 'B', 'C')):
    print(value, iden)

输出:

1 A
2 B
3 C
4 A
5 B
6 C
7 A
8 B
9 C
10 A

答案 1 :(得分:2)

您始终可以使用生成器来迭代标识符:

def infinite_generator(seq):
    while True:
        for item in seq:
            yield item

初始化标识符:

identifier = infinite_generator(['A', 'B', 'C'])

然后在你的循环中:

print(value, next(identifier))

答案 2 :(得分:1)

基于适合您问题的Ignacio's answer 您可以先reshapelist转换为包含3个元素的list of arrays

import pandas as pd
import numpy as np
import itertools

mylist = [1,2,3,4,5,6,7,8,9,10]
_reshaped = np.reshape(mylist[:len(mylist)-len(mylist)%3],(-1,3))

print(_reshaped)
[[1 2 3]
 [4 5 6]
 [7 8 9]]

请注意,由于您的列表包含多个3个元素(因此您需要删除最后一个元素以符合此条件,mylist[:len(mylist)-len(mylist)%3]) - Understanding slice notation 请参阅更新部分,了解适合您问题的重塑形式。

然后将Ignacio的解决方案应用于重新整形列表

for value, iden in zip(_reshaped, itertools.cycle(('A', 'B', 'C'))):
    print(value, iden)

[1 2 3] A
[4 5 6] B
[7 8 9] C

<强>更新
您可以使用@NedBatchelder's chunk generator按预期重塑数组:

def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]

mylist = [1,2,3,4,5,6,7,8,9,10]

_reshaped = list(chunks(mylist, 3))
print(_reshaped)
    [[1 2 3]
     [4 5 6]
     [7 8 9]
     [10]]

然后:

for value, iden in zip(_reshaped, itertools.cycle(('A', 'B', 'C'))):
    print(value, iden)

[1 2 3] A
[4 5 6] B
[7 8 9] C
[10] A

演出

您的解决方案:每循环1.32 ms±94.3μs
使用重新整形列表:每个循环1.32 ms±84.6μs

您注意到等效结果在性能方面没有敏感差异。

答案 3 :(得分:0)

您可以为切片创建一个生成器:

array.2