Python在列表中找到第二低的值

时间:2016-03-11 02:08:08

标签: python list loops

我有一个列表列表,例如:

a = [[1,0.8,0.4,0.1,0.3,0.5,1],
     [1,0.8,0.5,0.0,0.3,0.5,1]],
     ........................]

a[1]可以看出,数组中有一个负值。稍后在我的代码中,我在一个循环中从一个常量(在这种情况下它是1)中减去最小值,这样:

b = []
for i in range(len(a)):
    b.append(1-min(a[i]))

然而,这会产生一个问题,如a[1]我想要1-0.1而不是1-0.0。 0.0的值最初是负值(它是一个有噪声的数据点),因此我使用了:

a[a<0]=0.0

我无法使用a=a[a>0.0]完全删除该值,因为保留所有数据点(这些是具有相应x值的y值)非常重要。理想情况下我会忽略它而不是删除它。

有没有办法可以实现以下目标:

b = []
for i in range(len(a)):
    b.append(1-min(a[i]) where min(a[i]) is greater than 0) # i.e. the lowest value that isn't 0

5 个答案:

答案 0 :(得分:1)

这是一个解决方案。

b = []
for i in range(len(a)):
    b.append(1 - min(filter(lambda x: x>0, a[i])))

无需从源代码中删除,只需执行临时过滤,甚至只需:

b = map(lambda x : 1 - min(filter(lambda y: y>0, x)), a)

答案 1 :(得分:0)

您可以指定使min()更高的0的密钥:

b.append(1-min(a[i], key=lambda x: x if x else 1))

我使用1,因为看起来您的大部分数字都低于1。但重要的是,你使用的数字不是最低的。如果必须,您可以使用math.inf

答案 2 :(得分:0)

您可以使用循环查找一次传递中的最低和第二低值。

list = [...] #whatever
lowest = 0
secondLowest = 0

if list[0] < list[1]:
    lowest = list[0]
    secondLowest = list[1]
else:
    lowest = list[1]
    secondLowest = list[0]

for i in range(2, len(list)):
    if list[i] < lowest:
        secondLowest = lowest
        lowest = list[i]
    elif list[i] < secondLowest:
        secondLowest = list[i]

这将跟踪数组中的最低和第二低值。首先将lowest设置为第一个元素中的较低者,将secondLowest设置为另一个元素。然后它遍历列表,检查是否有任何值低于目前为止的最低值,或者到目前为止的第二低值。

答案 3 :(得分:0)

我找到了一个我想要的答案:

b = []
for i in range(len(a)):
    b.append(1-sorted(x for x in a[i] if x > 0)[0])

答案 4 :(得分:0)

def remove_min(lis1):
    # remove the minium element in the list
    lismin=min(lis1)
    newlis=[x for x in lis1 if x!=lismin]
    return newlis
def find_nminimum(lis,n):
    # find the n minimum element and return it
    for i in range(n):
        lis=remove_min(lis)
    return min(lis)

输出: find_nminimum(lis,0)给出列表的最小值。 find_nminimum(lis,n)给出列表中的第n个最小值。 当n&gt; len(lis)时,我没有考虑例外。