我正在处理以下代码:
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])
但它太丑陋了,根本不快。有谁知道更快的方法吗?
答案 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
您可以先reshape将list
转换为包含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