在Python中找到一组键值对的最小x和y值的最佳方法是什么?

3 投票
3 回答
1048 浏览
提问于 2025-04-18 04:17

给定一组数据:

[[0, 0], [1, 0], [0, 1], [-1, 0], [0, -1], [1, -1], [2, 0], [1, 1], [0, 2]]

在Python中,最快的方法是什么来找到一对中的最小值X和Y。在这个例子中,答案是[-1,-1]。

3 个回答

0

在编程中,有时候我们会遇到一些问题,可能是因为我们对某些概念理解得不够透彻。比如说,某些代码在运行时可能会出现错误,这时候我们就需要仔细检查代码的每一部分,看看哪里出了问题。

有些错误可能是因为拼写错误,或者是使用了不正确的变量名。还有一些错误可能是因为我们没有正确地使用某些函数或方法,这就需要我们去查阅相关的文档,了解这些函数的用法。

另外,调试工具也可以帮助我们找到问题所在。通过这些工具,我们可以逐步执行代码,观察每一步的结果,这样就能更容易地发现错误。

总之,遇到问题时,不要着急,慢慢分析,查找资料,通常都能找到解决办法。

minima = data[0]
for pair in data[1:]:
    minima = map(min, zip(pair, minima))
4

你可以在这里使用 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
7

不确定这是不是最快的,但可能是最简短和最“Python风格”的写法:

>>> map(min, zip(*data))
[-1, -1]

更新:我对这个做了一些时间分析,使用了10000个随机子列表和100次迭代。结果发现它比Aशwiniitemgetter方案稍微快一点,但普通的for循环还是最快的:

0.400840   min_mapminzip
0.579334   min_itemgetter
0.292459   min_loop

这是针对Python 2.x的... 在Python 3中,zipmap等都是迭代器,情况就不一样了:

0.186229   min_mapminzip   # wrong result, see below
0.686008   min_itemgetter
0.336031   min_loop

更正:我忘了在map是迭代器的情况下使用list,这样就创建了迭代器但没有真正执行任何工作... 感谢gnibblerAशwini的指正!使用list(map(...))后,执行时间和Python 2.x差不多,也就是说,普通的循环还是最快的。


更新 2:有趣的是,“map-min-zip”方案在相对较短的列表中更快——“短”指的是大约10000个项目。对于更长的列表,大约100000个及以上,“itemgetter”方案就变得更快。而普通的for循环始终是最快的...

撰写回答