理解列表

Comprehension Lists

我有三个不同的列表,分别名为 L1L2L3。我应该创建一个内部列表列表,其中每个内部列表都是 [x,y,z]x,y,z分别是L1L2L3中的元素,它们满足条件:

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]]