理解列表
Comprehension Lists
我有三个不同的列表,分别名为 L1
、L2
和 L3
。我应该创建一个内部列表列表,其中每个内部列表都是 [x,y,z]
。 x,y,z
分别是L1
、L2
和L3
中的元素,它们满足条件:
x > y, and x > z and y > 2*z
例如:
L1,L2,L3 = [8,11,12,13],[1,5,9],[4,8,10]
输出应该是:
[[11, 9, 4], [12, 9, 4], … ]
我试过了:
L1,L2,L3 = [[8,11,12,13], [1,5,9], [4,8,10]]
listush2 = [[r[0],r[1],r[2]] for r in L1,L2,L3 if r[0]>r[1] and r[0]>r[2] and r[1]>2*r[2]]
但我只得到:
>>> listush2
[]
我做错了什么?
看看你的 for
循环。
这个问题意味着你必须检查元素的三元组,其中这个三元组的每个元素都是一个列表的元素。您不是在迭代各个元素。
每个列表至少有一个循环遍历列表中的每个元素 - 所以你将有 三个 循环 - 然后你可以检查中所述的条件你的问题。
像这样的东西应该可以工作:
listush2 = [[x,y,z] for x in L1 for y in L2 for z in L3 if x > y and x > z and y > 2*z]
注意这个列表理解如何正确地迭代每个可能的元素三元组,其中三元组的每个值都来自一个列表。对于每个可能的三元组,检查问题中所述的条件,然后在条件评估为 True
.
时将此三元组值作为内部列表添加到整个输出列表中
运行 在 IPython:
In [7]: L1,L2,L3 = [8,11,12,13],[1,5,9],[4,8,10]
In [8]: listush2 = [[x,y,z] for x in L1 for y in L2 for z in L3 if x > y and x > z and y > 2*z]
In [9]: listush2
Out[9]: [[11, 9, 4], [12, 9, 4], [13, 9, 4]]
认为@rayryeng 的回答可能是预期的,结果列表理解不可读。正如他所指出的,问题在于您正在遍历列表而不是每个列表的元素。但是你所期望的被称为列表的产品并且在 itertools
模块中有一个单独的函数:
In [44]: from itertools import product
In [45]: [[r[0],r[1],r[2]] for r in product(L1,L2,L3) if r[0]>r[1] and r[0]>r[2] and r[1]>2*r[2]]
Out[45]: [[11, 9, 4], [12, 9, 4], [13, 9, 4]]
或更好:
In [46]: [[x, y, z] for x, y, z in product(L1,L2,L3) if x>y and x>z and y>2*z]
Out[46]: [[11, 9, 4], [12, 9, 4], [13, 9, 4]]
我有三个不同的列表,分别名为 L1
、L2
和 L3
。我应该创建一个内部列表列表,其中每个内部列表都是 [x,y,z]
。 x,y,z
分别是L1
、L2
和L3
中的元素,它们满足条件:
x > y, and x > z and y > 2*z
例如:
L1,L2,L3 = [8,11,12,13],[1,5,9],[4,8,10]
输出应该是:
[[11, 9, 4], [12, 9, 4], … ]
我试过了:
L1,L2,L3 = [[8,11,12,13], [1,5,9], [4,8,10]]
listush2 = [[r[0],r[1],r[2]] for r in L1,L2,L3 if r[0]>r[1] and r[0]>r[2] and r[1]>2*r[2]]
但我只得到:
>>> listush2
[]
我做错了什么?
看看你的 for
循环。
这个问题意味着你必须检查元素的三元组,其中这个三元组的每个元素都是一个列表的元素。您不是在迭代各个元素。
每个列表至少有一个循环遍历列表中的每个元素 - 所以你将有 三个 循环 - 然后你可以检查中所述的条件你的问题。
像这样的东西应该可以工作:
listush2 = [[x,y,z] for x in L1 for y in L2 for z in L3 if x > y and x > z and y > 2*z]
注意这个列表理解如何正确地迭代每个可能的元素三元组,其中三元组的每个值都来自一个列表。对于每个可能的三元组,检查问题中所述的条件,然后在条件评估为 True
.
运行 在 IPython:
In [7]: L1,L2,L3 = [8,11,12,13],[1,5,9],[4,8,10]
In [8]: listush2 = [[x,y,z] for x in L1 for y in L2 for z in L3 if x > y and x > z and y > 2*z]
In [9]: listush2
Out[9]: [[11, 9, 4], [12, 9, 4], [13, 9, 4]]
认为@rayryeng 的回答可能是预期的,结果列表理解不可读。正如他所指出的,问题在于您正在遍历列表而不是每个列表的元素。但是你所期望的被称为列表的产品并且在 itertools
模块中有一个单独的函数:
In [44]: from itertools import product
In [45]: [[r[0],r[1],r[2]] for r in product(L1,L2,L3) if r[0]>r[1] and r[0]>r[2] and r[1]>2*r[2]]
Out[45]: [[11, 9, 4], [12, 9, 4], [13, 9, 4]]
或更好:
In [46]: [[x, y, z] for x, y, z in product(L1,L2,L3) if x>y and x>z and y>2*z]
Out[46]: [[11, 9, 4], [12, 9, 4], [13, 9, 4]]