【问题标题】:Sorting list of tuples based on results of operation (division)根据运算结果对元组列表进行排序(除法)
【发布时间】:2016-11-14 04:06:48
【问题描述】:

好的 - 已经为此苦苦挣扎了一段时间。我刚刚开始学习 Python,在这方面非常新。

我有一个元组列表,需要按每个元组中值的比率进行排序。

输入:

L = [(1,3), (1,7), (4,8)]

返回一个排序列表:

L = [(1,7), (1,3), (4,8)]

需要使用 sort 和自定义键对其进行排序。我见过人们使用 itemgetter,但我也无法使用该版本。

到目前为止我的尝试:

sorted(L, key = lambda x: [(i[0]/float(i[1])) for i in x])

我一直以此为指导: How to sort (list/tuple) of lists/tuples?

似乎使用 itemgetter 是最快的,但我也无法让它工作......

【问题讨论】:

  • key = lambda x: (x[0]/float(x[1]))
  • 顺便说一句,如果您使用的是 Python 2,则可以通过将 from __future__ import division 放在导入的顶部来获得 Python 3 样式划分(除非您使用的是 very Python 2 的古代版本)。然后你就不需要float 转换电话了。如果您想要楼层划分,您应该始终使用//,即使您不使用该导入,因为最好明确说明您在做什么。

标签: python sorting tuples


【解决方案1】:

你们很亲密。 lambda 函数中不需要 for 循环。

>>> L = [(1,3), (1,7), (4,8)]
>>> sorted(L, key=lambda i: i[0]/float(i[1])) # no need for the for loop
[(1, 7), (1, 3), (4, 8)]
>>> 

你也可以像这样使用operator.itemgetter()

>>> L = [(1,3), (1,7), (4,8)]
>>> from operator import itemgetter
>>> ig = itemgetter(0), itemgetter(1)
>>> sorted(L, key= lambda i: ig[0](i)/float(ig[1](i)))
[(1, 7), (1, 3), (4, 8)]
>>> 

【讨论】:

  • 这……真的很令人沮丧。只是花了几个小时尝试所有不同的方式。你知道如何通过 itemgetter 方法来做吗(据说是最快的?)?
  • 像这样使用itemgetter 并没有什么好处,因为每次调用 lambda 时都会执行两次 itemgetter 调用。最好在 lambda 之外进行 itemgetter 调用。例如,ig0, ig1 = itemgetter(0), itemgetter(1)sorted(L, key= lambda i: ig0(i)/ig1(i))。但是你也可以只索引到元组中。 :)
  • @PM2Ring Yout 从我嘴里说出来的话。这正是我要写的:) 但我忽略了在 lambda 之外调用 itemgetter () 的事实。我会更新的。
猜你喜欢
  • 1970-01-01
  • 2014-12-02
  • 2023-01-30
  • 2020-09-07
  • 1970-01-01
  • 2018-08-13
  • 2021-04-06
  • 1970-01-01
相关资源
最近更新 更多