如果满足条件,则获取列表列表的最大元素

时间:2019-09-22 10:00:02

标签: python list loops nested list-comprehension

我有一个列表列表:

 [[[10, 15, 200, 220], [10, 15, 200, 220], 0.0],
 [[10, 15, 200, 220], [20, 25, 200, 230], 17.320508075688775],
 [[110, 150, 240, 300], [10, 15, 200, 220], 190.3286631067428],
 [[110, 150, 240, 300], [100, 150, 230, 300], 14.142135623730951],
 [[110, 150, 240, 300], [110, 150, 240, 300], 0.0]]

如果第三个实数小于阈值(比如50),我想获得列表中每个元素的最大值。换句话说,在上述情况下,所需的结果将是:

1)根据阈值过滤结果,例如

 [[[10, 15, 200, 220], [10, 15, 200, 220], 0.0],
 [[10, 15, 200, 220], [20, 25, 200, 230], 17.320508075688775],
 [[110, 150, 240, 300], [100, 150, 230, 300], 14.142135623730951],
 [[110, 150, 240, 300], [110, 150, 240, 300], 0.0]]

2)获取列表中每个元素的最大值:

[20, 25, 200, 230]
[110, 150, 240, 300]

2 个答案:

答案 0 :(得分:1)

>>> L = [[[10, 15, 200, 220], [10, 15, 200, 220], 0.0],
...  [[10, 15, 200, 220], [20, 25, 200, 230], 17.320508075688775],
...  [[110, 150, 240, 300], [10, 15, 200, 220], 190.3286631067428],
...  [[110, 150, 240, 300], [100, 150, 230, 300], 14.142135623730951],
...  [[110, 150, 240, 300], [110, 150, 240, 300], 0.0]]

您可以使用列表理解功能过滤最后一个元素上的列表列表:

>>> [M for M in L if M[-1]<50]  
[[[10, 15, 200, 220], [10, 15, 200, 220], 0.0], [[10, 15, 200, 220], [20, 25, 200, 230], 17.320508075688775], [[110, 150, 240, 300], [100, 150, 230, 300], 14.142135623730951], [[110, 150, 240, 300], [110, 150, 240, 300], 0.0]]

现在,要合并以前的列表,可以使用一个zip(我在0上添加了所需输出所隐含的过滤器):

>>> [[max(*xs) for xs in zip(*M[:-1])] for M in L if 0<M[-1]<50]  
[[20, 25, 200, 230], [110, 150, 240, 300]]

说明:想法是压缩列表,例如:

>>> list(zip([10, 15, 210, 220], [10, 25, 200, 250]))
[(10, 10), (15, 25), (210, 200), (220, 250)]

并采用元组的最大元素:

>>> [max(x,y) for x,y in zip([10, 15, 210, 220], [10, 25, 200, 250])]
[10, 25, 210, 250]

我使用star运算符使代码更灵活:它不依赖于列表数:

>>> list(zip([10, 15, 210, 220], [10, 25, 200, 250], [15, 20, 210, 260]))
[(10, 10, 15), (15, 25, 20), (210, 200, 210), (220, 250, 260)]
>>> [max(*xs) for xs in zip([10, 15, 210, 220], [10, 25, 200, 250], [15, 20, 210, 260])]
[15, 25, 210, 260]

答案 1 :(得分:0)

尝试一下:

a = [[[10, 15, 200, 220], [10, 15, 200, 220], 0.0],
 [[10, 15, 200, 220], [20, 25, 200, 230], 17.320508075688775],
 [[110, 150, 240, 300], [10, 15, 200, 220], 190.3286631067428],
 [[110, 150, 240, 300], [100, 150, 230, 300], 14.142135623730951],
 [[110, 150, 240, 300], [110, 150, 240, 300], 0.0]]
filtered = [i for i in a if i[2] < 50.0]
[get_maximum( i ) for i in filtered]

一旦您解释了“ 2)获得列表中每个元素的最大值:”的意思或将自己实现,这将起作用。

相关问题