通过对象列表中的每个元素索引查找最小值(不包括零)

时间:2019-04-12 17:54:43

标签: python

我下面有这个功能,使对象实例成为列表, lst = [] Ppl类:     def __init __(self,pid):         #局部变量         self.pid = pid         self.pos = [3 * pid,10 + pid-4 * pid,5 * pid] 对于范围(3)中的索引:     lst.append(Ppl(index)) 对于范围内的索引(len(lst)):     打印(lst [index] .pos) 以上将输出。 [0,10,0] [3,7,5] [6,4,10] 现在我想根据上面的列表制作一个理解列表,以获得除零以外的最小值。这样预期的输出是 [3,4,5] 我下面有这个功能,但它包含0。 lst2 = list(map(min,* [x.pos for lst in xst]))) 打印(lst2) >> [0,4,0] 那么有什么方法可以改善上述代码,还是有更好的解决方案?

3 个答案:

答案 0 :(得分:1)

您可以轻松地为此定义一个函数:

def min2(iterator, threshold = 0):
    minvalue = None
    for x in iterator:
        if (x > threshold) and (x < minvalue or minvalue is None):
            minvalue = x

    return minvalue

使用一些断言对其进行测试:

assert min2([0, 10, 0]) == 10
assert min2([3, 7, 5]) == 3
assert min2([6, 4, 10]) == 4
assert min2([10, 10, 101], threshold=100) == 101

答案 1 :(得分:1)

尝试以下代码段。

import numpy as np
lst2 = np.array([x.pos for x in lst])
lst2[lst2==0]=np.max(lst2)
print(np.min(lst2,axis=0))

输出: [3 4 5]

答案 2 :(得分:1)

如果您只能使用单线,则可以采用以下解决方案:

lst2 = list(map(lambda *args: min(arg for arg in args if arg != 0), *[x.pos for x in lst]))

min替换为在过滤零值后应用min的lambda。