我有一个列表列表,例如:
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
答案 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)时,我没有考虑例外。