我正在尝试使用大小为n和n / 2的两个不同数组中的内容快速生成列表。举个例子:
A = [70, 60, 50, 40, 30, 20, 10, 0]
B = [1, 2, 3, 4]
我希望产生类似
[(A[x], B[y]) for x in range(len(A)) for y in range(len(B))]
我知道第二个for语句是在“ x”之后的嵌套for循环。我正在尝试获取新数组的内容
A[0], B[0]
A[1], B[1]
A[2], B[2]
A[3], B[3]
A[4], B[0]
A[5], B[1]
A[6], B[2]
A[7], B[3]
有人能指出我正确的方向吗?
不要使用嵌套循环;你配对起来A
,并B
与B
根据需要重复。您需要的是zip()
(进行配对)和itertools.cycle()
(重复B
):
from itertools import cycle
zip(A, cycle(B))
如果B
始终是的一半A
,那么您还可以加倍B
:
zip(A, B + B)
演示:
>>> from itertools import cycle
>>> A = [70, 60, 50, 40, 30, 20, 10, 0]
>>> B = [1, 2, 3, 4]
>>> zip(A, cycle(B))
[(70, 1), (60, 2), (50, 3), (40, 4), (30, 1), (20, 2), (10, 3), (0, 4)]
>>> zip(A, B + B)
[(70, 1), (60, 2), (50, 3), (40, 4), (30, 1), (20, 2), (10, 3), (0, 4)]
对于不知道哪个是较长列表的情况,您可以使用min()
并max()
选择要循环的一个:
zip(max((A, B), key=len), cycle(min((A, B), key=len))
或将任意数量的列表配对,将它们全部循环,但用于itertools.islice()
将内容限制为最大长度:
inputs = (A, B) # potentially more
max_length = max(len(elem) for elem in inputs)
zip(*(islice(cycle(elem), max_length) for elem in inputs))
演示:
>>> from itertools import islice
>>> inputs = (A, B) # potentially more
>>> max_length = max(len(elem) for elem in inputs)
>>> zip(*(islice(cycle(elem), max_length) for elem in inputs))
[(70, 1), (60, 2), (50, 3), (40, 4), (30, 1), (20, 2), (10, 3), (0, 4)]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句