我有一个数字列表,None
是这样的:
l = [2., None, 3., 1., None, 2., None, 5.]
我想获得最小数量及其索引,而None
s应该被忽略。对于给定的示例,结果将是:
(1., 3)
当然,编写一个能够满足我想要的功能是很简单的,但我更喜欢一些有效的内置或至少是高级方法。
我对Python 3的解决方案特别感兴趣,其中min
- 函数不接受None
作为参数。
答案 0 :(得分:4)
min((v,i) for i,v in enumerate(l) if v is not None)
(1.0, 3) # (value, index)
答案 1 :(得分:3)
我可能有两部分:
m = min(x for x in l if x is not None)
s = (m, l.index(m)) # this will grab the first index
如果您想使列表成为单通道+一个班轮解决方案:
midx, mval = min(enumerate(x if x is not None else float('inf') for x in l), key=lambda i: i[1])
enumerate()
段产生如下迭代:
0 2.0
1 inf
2 3.0
3 1.0
4 inf
5 2.0
6 inf
7 5.0
然后调用min()
并使用enumerate()
返回lambda
来检查i[1]
索引中的值(例如2.0, inf, ..., 5.0
)。因此,使用原始列表中的生成器仅返回一个迭代,返回最终元组,以“过滤并替换”NoneType
索引。
答案 2 :(得分:3)
您可以定义转化功能,并将其与min
:
lst = [2., None, 3., 1., None, 2., None, 5.]
def converter(x):
return x[1] if x[1] is not None else float('inf')
res = min(enumerate(lst), key=converter)[::-1]
(1.0, 3)
如果您对使用第三方库感到满意,请使用NumPy中的等效文件:
arr = np.array(lst).astype(float)
arr[np.isnan(arr)] = np.inf
res = arr.min(), arr.argmin()
或者,更有效率,您可以使用np.nanargmin
:
arg = np.nanargmin(arr)
minval = arr[arg]
res = minval, arg
答案 3 :(得分:1)
l = [2., None, 3., 1., None, 2., None, 5.]
idx = l.index(min(x for x in l if x is not None))
print(l[idx], idx) # get value, and idx
输出
1.0 3
答案 4 :(得分:0)
这是一种方法。
<强>演示:强>
(1.0, 3)
<强>输出:强>
private void fastlevel_CheckedChanged(object sender, EventArgs e)
int turn=0;
if (fastlevel.Checked)
{
//Click X;Y
Thread.Sleep(1000);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
//MessageBox.Show("OK");
if(turn==0)
{
turn++;
//if bitmap was found
MessageBox.Show("FIRST TURN");
{
else
{
MessageBox.Show("SECOND TURN");
turn++;
}
}
答案 5 :(得分:0)
value = min(l, key=lambda x: float('inf') if x is None else x)
index = l.index(value)
如果这是一个问题,可能包括检查值不是inf(即l中没有数字的情况)
此方法通过简单地更改min比较值的方式,避免在内部构建新数组。
答案 6 :(得分:0)
您可以避免像这样使用key
:
>>> import operator as op
>>> import itertools as it
>>> min(it.filterfalse(op.methodcaller('__contains__', None), zip(l, it.count())))
(1.0, 3)
答案 7 :(得分:0)
最复杂的是在列表中替换,我认为:
import numpy as np
l = [2., None, 3., 1., None, 2., None, 5.]
#### function to replace in a list
def replaced(sequence, old, new):
return (new if x == old else x for x in sequence)
l=list(replaced(l,None,np.nan))
#### numpy specific function
position = np.nanargmin(l)
value = l[position]
print(position, value)
答案 8 :(得分:0)
虽然我更喜欢接受的答案。 您可以使用 NoneType 的演示代码:
lst = [2., None, 3., 1., None, 2., None, 5.]
def converter(x):
NoneType = type(None)
return x[1] if not isinstance(x[1], NoneType) else float('inf')
res = min(enumerate(lst), key=converter)[::-1]
print(res)
给予
(1.0, 3)
答案 9 :(得分:-1)
为什么结果应该是(1.,3),之后是1,2,
l = [2., None, 3., 1., None, 2., None, 5.]
bar = map(float, [e for e in l if isinstance(e, float)])
print (min(float(i) for i in bar))