【问题标题】:Get maximum element of list of list if condition is met如果满足条件,则获取列表列表的最大元素
【发布时间】:2020-01-22 16:13:41
【问题描述】:

我有列表列表:

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

【问题讨论】:

  • 你的意思是说 0.0, 17.320508075688775,... 小于 50?
  • @ThatBird 是的,计算实际值(0.0、17.320508075688775...)小于 50 的情况的结果。
  • 2) get maximum of each element in list 是什么意思?你是怎么从 4 个列表中只得到 2 个结果的??
  • @lenik 是的,你是对的。我不知道如何很好地解释它。我可以按其元素的平均值过滤列表并在最后得到 2 个结果吗?

标签: python list loops nested list-comprehension


【解决方案1】:

试试这个:

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) get maximum of each element in list:”的含义或自己实现它,这将起作用。

【讨论】:

    【解决方案2】:
    >>> 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      • 2020-06-27
      相关资源
      最近更新 更多