使用两个不同范围的变量尝试Python列表理解

A.K*_*.K. 12 python list-comprehension list

我正在尝试使用来自两个大小为n和n/2的不同数组的内容快速生成列表.举个例子:

A = [70, 60, 50, 40, 30, 20, 10, 0]
B = [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我想生成类似的东西

[(A[x], B[y]) for x in range(len(A)) for y in range(len(B))]
Run Code Online (Sandbox Code Playgroud)

我理解第二个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]
Run Code Online (Sandbox Code Playgroud)

有人能指出我正确的方向吗?

Mar*_*ers 21

不要使用嵌套循环; 你配对起来A,并BB根据需要重复.你需要的是zip()(做配对)和itertools.cycle()(重复B):

from itertools import cycle

zip(A, cycle(B))
Run Code Online (Sandbox Code Playgroud)

如果B总是一半大小A,你也可以加倍B:

zip(A, B + B)
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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)]
Run Code Online (Sandbox Code Playgroud)

对于不知道哪个是较长列表的情况,您可以使用min()max()选择要循环的列表:

zip(max((A, B), key=len), cycle(min((A, B), key=len))
Run Code Online (Sandbox Code Playgroud)

或者对于任意数量的列表进行配对,将它们全部循环,但用于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))
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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)]
Run Code Online (Sandbox Code Playgroud)


zon*_*ndo 10

[(A[x % len(A)], B[x % len(B)]) for x in range(max(len(A), len(B)))]

无论A是否是较大的列表,这都将起作用.:)


Joh*_*ard 5

尝试仅使用一个for循环而不是两个,并且一旦超过其长度,将第二个回绕为0.

[(A[x], B[x%len(B)]) for x in range(len(A))]
Run Code Online (Sandbox Code Playgroud)

请注意,这仅在A为较长列表时才有效.如果你知道B总是A的一半,你也可以使用:

list(zip(A, B*2))
Run Code Online (Sandbox Code Playgroud)