Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用两个不同范围的变量理解Python列表_Python_List_List Comprehension - Fatal编程技术网

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

尝试使用两个不同范围的变量理解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]

我正在尝试快速生成一个列表,其中包含大小为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
。您需要的是(进行配对)和(重复
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))