Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表的最小值_Python_List_Min - Fatal编程技术网

Python 列表的最小值

Python 列表的最小值,python,list,min,Python,List,Min,我有一个这样的列表: [[10564, 15], [10564, 13], [10589, 18], [10637, 39], [10662, 38], [10712, 50], [10737, 15], [10762, 14], [10787, 9], [10812, 12], [10837, 45], [3, 17], [7, 21], [46, 26], [48, 12], [49, 24], [64, 14], [66, 17], [976, 27], [981, 22], [982,

我有一个这样的列表:

[[10564, 15], [10564, 13], [10589, 18], [10637, 39], [10662, 38], [10712, 50], [10737, 15], [10762, 14], [10787, 9], [10812, 12], [10837, 45], [3, 17], [7, 21], [46, 26], [48, 12], [49, 24], [64, 14], [66,
 17], [976, 27], [981, 22], [982, 22], [983, 17], [985, 13], [517, 9], [521, 15], [525, 11], [526, 13], [528, 14], [698, 14], [788, 24], [792, 19]]

我试图为每个列表中的第二个元素找到最低值(因此比较15到13到18等,而不是比较10564和15),但也要将其划分为范围,这样我可以说,每个列表中最低的第二个元素[1],只有在元素[0]超过10000等情况下。我可以怎么做?我试过了,到目前为止只能比较同一列表中的元素,这不是我想要的。在我提到的情况下,我将返回[10787,9],但如果有另一个值大于10000,则我也希望返回该值。

这取决于您希望输出的内容。首先,您需要根据“范围”1筛选列表

a=[[10564, 15], [10564, 13], [10589, 18], [10637, 39], [10662, 38], [10712, 50], [10737, 15], [10762, 14], [10787, 9], [10812, 12], [10837, 45], [3, 17], [7, 21], [46, 26], [48, 12], [49, 24], [64, 14], [66, 17], [976, 27], [981, 22], [982, 22], [983, 17], [985, 13], [517, 9], [521, 15], [525, 11], [526, 13], [528, 14], [698, 14], [788, 24], [792, 19]]

print min(map(lambda y: y[1] ,filter(lambda x: x[0]>10000,a)))
if
条件可以是您想要的复杂程度(在有效语法范围内)。e、 g:

当然,您可以将整个内容内联:

min(x[1] for x in lists if x[0] > 10000)
如果需要整个子列表:

from operator import itemgetter
min(gen,key=itemgetter(1))
例如:

>>> lists = [[10564, 15], [10564, 13], [10589, 18], [10637, 39], [10662, 38], [10712, 50], [10737, 15], [10762, 14], [10787, 9], [10812, 12], [10837, 45], [3, 17], [7, 21], [46, 26], [48, 12], [49, 24], [64, 14], [66,17], [976, 27], [981, 22], [982, 22], [983, 17], [985, 13], [517, 9], [521, 15], [525, 11], [526, 13], [528, 14], [698, 14], [788, 24], [792, 19]]
>>> gen = (x for x in lists if x[0] > 10000)
>>> min(x[1] for x in gen)
9
>>> gen = (x for x in lists if x[0] > 10000)
>>> from operator import itemgetter
>>> min(gen,key=itemgetter(1))
[10787, 9]
不幸的是,这些只会给出第一个子列表,它与标准匹配。要获得所有这些,请执行以下操作:

target = min(x[1] for x in lists if x[0] > 10000)
matches = [x for x in lists if (x[1] == target) and (x[0] > 10000)]
如果您确定匹配项少于
N
,则可以使用
heapq
itertools.takewhile
更有效地执行此操作。在不知道匹配数上限的一般情况下,我认为这个解决方案更好(它是O(N),而排序是O(NlogN))


1请注意,“生成器表达式”在耗尽之前只能迭代一次

更新您的评论(您可以使用lambda作为key-in-min函数,在大型列表中使用itemgetter更快一些):


这里有一个非常简单的方法,只需找到最小值,然后根据该值构建列表

>>> a = [[10564, 15], [10564, 13], [10589, 18], [10637, 39], [10662, 38], [10712, 50], [10737, 15], [10762, 14], [10787, 9], [10812, 12], [10837, 45], [3, 17], [7, 21], [46, 26], [48, 12], [49, 24], [64, 14], [66,
...  17], [976, 27], [981, 22], [982, 22], [983, 17], [985, 13], [517, 9], [521, 15], [525, 11], [526, 13], [528, 14], [698, 14], [788, 24], [792, 19]]
>>> a_min = min(i[1] for i in a)
>>> [i[0] for i in a if i[1] == a_min and i[0] > 10000] + [a_min]
[10787, 9]
该代码正确显示多个值:

>>> a += [[10391, 9]] #add another pair with a first value > 10000
>>> [i[0] for i in a if i[1] == a_min and i[0] > 10000] + [a_min]
[10787, 10391, 9]

如果您需要多个
min
s,那么您最好过滤适用的元素并对它们进行排序

vals = sorted((el for el in your_list if el[0] >= 10000), key=lambda L: L[1])
# [[10787, 9], [10812, 12], [10564, 13], [10762, 14], [10564, 15], [10737, 15], [10589, 18], [10662, 38], [10637, 39], [10837, 45], [10712, 50]]

然后,您可以使用
vals[0]
来获取第一个,
vals[1]
来获取第二个,或者使用诸如
vals[:5]

之类的切片,非常简单,谢谢,在这种情况下,我想返回[10564,13]。这将是我最喜欢的,除非
x[0]>10000
中没有一个保持不变,您将获得
ValueError:min()arg是一个空序列
。所以,你需要在<代码>中尝试包装:除非 <代码> min <代码>(我不认为这很容易)。保罗让这个代码更加自我记录,考虑拆解<代码> x [0 ] < /C>和<代码> x(1)< /Cord>,并给出它们的描述性名称,像这样,我只是在猜测
x[0]
x[1]
可能是什么:
min(分数的id,如果分数>10000,则l中的id)
@LauritzV.Thaulow是的,变量更具描述性的名称总是更可取的!即使是我自己,更不用说其他人了。回答得很好。是的,我想返回[10787,9],我将阅读itemgetter。我不明白你所说的生成器表达式精疲力竭是什么意思。因为某种原因我不能再重复一遍吗?@Paul--没错。生成器只能迭代一次。通常这不是问题(您可以创建另一个)。但是,如果这是一个问题,您可以使用列表理解来代替:
lst=[x为x,如果x[0]>10000]
啊,我明白了,太好了。谢谢更熟悉列表理解。“除了括号外,我看不出有什么区别,我必须读懂generator的区别,谢谢你。@Paul--在语法方面,唯一的区别是括号。”。就功能而言,生成器会动态生成数字序列,
仅在请求时才会生成它们(例如,通过for循环)。您可以将列表理解视为一种结构,它迭代生成器并将每个值存储在列表中。所以,这里的一个区别是在存储/内存使用方面。“但是如果有另一个值超过10000和9,我也想返回它。”-这个例子呢?谢谢,我也会运行它来理解它。非常好,我喜欢所有可能相等值的小列表!我想我宁愿写
a.append(lst)
也不愿写
a+=[lst]
还有,为什么:
[I[1]==aÈmin和I[0]>10000]+[aÈmin]
而不是:
[I=aÈmin和I[0]>10000]
这里你甚至可以使用
itertools.takewhile
拉取
L
在哪里
L[1]==VAL[0][1]
>>> l=[[10564, 15], [10564, 13], [10589, 18], [10637, 39]]
>>> min(x[1] for x in l if x[0] > 10000)
13
>>>
>>> min((x for x in l if x[0] > 10000), key=lambda k:k[1])
[10564, 13]
>>> a = [[10564, 15], [10564, 13], [10589, 18], [10637, 39], [10662, 38], [10712, 50], [10737, 15], [10762, 14], [10787, 9], [10812, 12], [10837, 45], [3, 17], [7, 21], [46, 26], [48, 12], [49, 24], [64, 14], [66,
...  17], [976, 27], [981, 22], [982, 22], [983, 17], [985, 13], [517, 9], [521, 15], [525, 11], [526, 13], [528, 14], [698, 14], [788, 24], [792, 19]]
>>> a_min = min(i[1] for i in a)
>>> [i[0] for i in a if i[1] == a_min and i[0] > 10000] + [a_min]
[10787, 9]
>>> a += [[10391, 9]] #add another pair with a first value > 10000
>>> [i[0] for i in a if i[1] == a_min and i[0] > 10000] + [a_min]
[10787, 10391, 9]
vals = sorted((el for el in your_list if el[0] >= 10000), key=lambda L: L[1])
# [[10787, 9], [10812, 12], [10564, 13], [10762, 14], [10564, 15], [10737, 15], [10589, 18], [10662, 38], [10637, 39], [10837, 45], [10712, 50]]