在Python中找到一组键值对的最小x和y值的最佳方法是什么?
给定一组数据:
[[0, 0], [1, 0], [0, 1], [-1, 0], [0, -1], [1, -1], [2, 0], [1, 1], [0, 2]]
在Python中,最快的方法是什么来找到一对中的最小值X和Y。在这个例子中,答案是[-1,-1]。
3 个回答
在编程中,有时候我们会遇到一些问题,可能是因为我们对某些概念理解得不够透彻。比如说,某些代码在运行时可能会出现错误,这时候我们就需要仔细检查代码的每一部分,看看哪里出了问题。
有些错误可能是因为拼写错误,或者是使用了不正确的变量名。还有一些错误可能是因为我们没有正确地使用某些函数或方法,这就需要我们去查阅相关的文档,了解这些函数的用法。
另外,调试工具也可以帮助我们找到问题所在。通过这些工具,我们可以逐步执行代码,观察每一步的结果,这样就能更容易地发现错误。
总之,遇到问题时,不要着急,慢慢分析,查找资料,通常都能找到解决办法。
minima = data[0]
for pair in data[1:]:
minima = map(min, zip(pair, minima))
你可以在这里使用 min
:
>>> from operator import itemgetter
>>> lst = [[0, 0], [1, 0], [0, 1], [-1, 0], [0, -1], [1, -1], [2, 0], [1, 1], [0, 2]]
>>> x = min(lst, key=itemgetter(0))[0]
>>> y = min(lst, key=itemgetter(1))[1]
>>> x, y
(-1, -1)
在我的系统上(i5 4670),处理9000000个项目大约需要1秒:
In [3]: lst = lst*10**6
In [4]: %timeit (min(lst, key=itemgetter(0))[0], min(lst, key=itemgetter(1))[1])
1 loops, best of 3: 1.01 s per loop
一个普通的单循环版本大约需要341毫秒:
def find_min(seq):
min_x = float('inf')
min_y = float('inf')
for x, y in seq:
if x < min_x : min_x = x
if y < min_y : min_y = y
return min_x, min_y
时间比较:
len(lst)
Out[42]: 9000000
%timeit find_min(lst)
1 loops, best of 3: 341 ms per loop
%timeit map(min, zip(*lst))
1 loops, best of 3: 1.21 s per loop
%timeit map(min, izip(*lst))
1 loops, best of 3: 1.14 s per loop
%timeit (min(lst, key=itemgetter(0))[0], min(lst, key=itemgetter(1))[1])
1 loops, best of 3: 1.04 s per loop
不确定这是不是最快的,但可能是最简短和最“Python风格”的写法:
>>> map(min, zip(*data))
[-1, -1]
更新:我对这个做了一些时间分析,使用了10000个随机子列表和100次迭代。结果发现它比Aशwini的itemgetter
方案稍微快一点,但普通的for
循环还是最快的:
0.400840 min_mapminzip
0.579334 min_itemgetter
0.292459 min_loop
这是针对Python 2.x的... 在Python 3中,zip
、map
等都是迭代器,情况就不一样了:
0.186229 min_mapminzip # wrong result, see below
0.686008 min_itemgetter
0.336031 min_loop
更正:我忘了在map
是迭代器的情况下使用list
,这样就创建了迭代器但没有真正执行任何工作... 感谢gnibbler和Aशwini的指正!使用list(map(...))
后,执行时间和Python 2.x差不多,也就是说,普通的循环还是最快的。
更新 2:有趣的是,“map-min-zip”方案在相对较短的列表中更快——“短”指的是大约10000个项目。对于更长的列表,大约100000个及以上,“itemgetter”方案就变得更快。而普通的for循环始终是最快的...