尝试使用两个不同范围的变量理解Python列表
我正在尝试快速生成一个列表,其中包含大小为n和n/2的两个不同数组的内容。例如:尝试使用两个不同范围的变量理解Python列表,python,list,list-comprehension,Python,List,List Comprehension,我正在尝试快速生成一个列表,其中包含大小为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 = [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
。您需要的是(进行配对)和(重复B
):
如果B
的大小总是A
的一半,您也可以将B
的大小增加一倍:
from itertools import cycle
zip(A, cycle(B))
zip(A, B + B)
演示:
对于不知道哪个列表较长的情况,可以使用min()
和max()
选择要循环的列表:
zip(max((A, B), key=len), cycle(min((A, B), key=len))
或者,对于任意数量的要配对的列表,请将它们全部循环,但要将内容限制在最大长度:
inputs = (A, B) # potentially more
max_length = max(len(elem) for elem in inputs)
zip(*(islice(cycle(elem), max_length) for elem in inputs))
演示:
尝试只使用一个for循环而不是两个for循环,并在第二个for循环超过其长度后将其返回到0
[(A[x], B[x%len(B)]) for x in range(len(A))]
请注意,仅当A是较长的列表时,此选项才起作用。如果您知道B的大小总是A的一半,您也可以使用:
list(zip(A, B*2))
[(A[x%len(A)],B[x%len(B)]表示范围内的x(最大值(len(A),len(B))]
无论A是否是较大的列表,这都将起作用。:) 这太完美了。非常感谢你。我尝试使用zip()函数,但只接收到len(B)之前的对。我不知道我能做zip(A,B+B)。@A.K.:
zip()
以最短的长度终止。然后,诀窍是使A
最短。另一种处理任意数字的方法是在zip外部使用islice:列表(islice(zip(*map(cycle,inputs)),max(map(len,inputs)))
。
[(A[x], B[x%len(B)]) for x in range(len(A))]
list(zip(A, B*2))