【问题标题】:Find the index of minimum value of tuple pairs in Python在 Python 中查找元组对的最小值的索引
【发布时间】:2021-05-30 04:18:44
【问题描述】:

使用元组对列表n=[(266, 116), (81, 296), (148, 115), (324, 303)] 我试图有效地找到最左边点的索引。目前,我的代码如下所示:

min_index = 0
for i in range(1,len(n)): 
     if points[i][0] < points[min_index][0]: 
            minIndex = i 

但对我来说这看起来效率不高。我还找到了一个使用 lambda 函数的解决方案,它至少看起来更有吸引力(关于 min 函数的时间复杂度)

min(n, key = lambda t: t[0])

但这给了我实际的坐标,而不是我想要的索引。如何更改 lambda 函数以提供实际索引,在 时间复杂度 方面是否有更好的解决方案?谢谢

【问题讨论】:

  • 您的 for 循环没有任何问题或“效率低下”。

标签: python arrays lambda tuples min


【解决方案1】:

min 中使用range(len(n)) 而不是n

>>> min(range(len(n)), key = lambda i: n[i][0])
1

注意:循环方法无论如何都不是低效的,因为数据中没有明显的模式,因此您不能使用二分法(例如二进制搜索),而 min 确实 几乎相同的东西,有时只是首选,因为它是内置的,更简洁,更不容易出错。

【讨论】:

  • 非常感谢!据我了解,虽然理论上这和普通循环一样复杂,但实际上,因为在C层,min/max内置函数避免了字节码解释器,它可以快一点,所以有没有办法找到比 O(n) 更复杂的最小值,对吧?
  • @SamuelV。确切地说,由于您必须遍历所有元素,因此最好使用内置方式而不是您的方式,如果可以的话(您可以考虑例外情况)。
【解决方案2】:

您也可以在lambda 部分中的enumerate 获取索引和值:

n = [(266, 116), (81, 296), (148, 115), (324, 303)]
min_index, min_value = min(enumerate(n), key = lambda n: n[1][0])
print(min_index, min_value)   # 1 (81, 296)

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 2013-06-01
    • 2017-08-13
    • 2019-01-12
    • 2017-11-05
    • 2012-10-18
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多