Получить максимальный элемент списка списка, если условие выполнено - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть список списков:

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

1 голос
/ 23 сентября 2019
>>> 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]

Я использовал оператор звездочки, чтобы сделать код более гибким: он не зависит от количества списков:

>>> 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]
0 голосов
/ 22 сентября 2019

Попробуйте:

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) получить максимум для каждого элемента в списке:" означает или реализует его самостоятельно.

...