【问题标题】:Sort List of Tuples Containing Strings By First Element Float (Python)按第一个元素浮点数对包含字符串的元组列表进行排序(Python)
【发布时间】:2017-08-03 18:42:56
【问题描述】:

我有一长串元组:

[...
(0.862, 'beehive', 'bug'),
(0.12, 'yard', 'property'),
(0.0, 'lake', 'mailbox'),
(0.37, 'maintenance', 'shears'),
(0.1666, 'summer', 'popsicle'),
(0.9, 'poplar', 'tree')
...]

我需要按浮点值降序对该列表进行排序。我知道 Python 会自动按第一个值对列表进行排序,但是即使我调用 sorted 甚至明确指定第一个元素,我也没有成功。

sorted(mylist) # doesn't sort the list at all

sorted(mylist, key = x[0]) # on this sort attempt I get "'str' object is not callable"

任何人都可以详细说明为什么尽管进行了这些排序尝试,列表仍然杂乱无章,以及什么可能按浮点数降序排序?

【问题讨论】:

  • sorted(..) 返回一个列表。
  • ... 对于降序你想要reverse=True...
  • 关于 key 不起作用:您需要提供一个可调用对象,如下所示:key=lambda x: x[0]key=itertools.itemgetter(0)

标签: python list sorting floating-point tuples


【解决方案1】:

sorted(..) 返回一个 列表。您正在寻找的是.sort(..) 对列表进行就地排序。

此外,您还可以使用reverse 参数进行降序排序:

data.sort(reverse=True)  # sort the list inplace

这将返回:

>>> data.sort(reverse=True)
>>> data
[(0.9, 'poplar', 'tree'), (0.862, 'beehive', 'bug'), (0.37, 'maintenance', 'shears'), (0.1666, 'summer', 'popsicle'), (0.12, 'yard', 'property'), (0.0, 'lake', 'mailbox')]

元组的默认排序将首先对第一个元素进行排序。如果它们相等,它将考虑每个元组的第二个元素,依此类推。

如果您不想要这个决胜局,但在这种情况下使用 original 顺序,您可以使用itemgetter 作为key

from operator import itemgetter

data.sort(reverse=True,key=itemgetter(0))  # sort the list inplace

如果您想构造一个已排序的列表,您可以将 same 参数与sorted(..) 一起使用:

data_sorted = sorted(data,reverse=True)  # construct a new sorted list

【讨论】:

  • 再次感谢 Willem - 我想我无意中寻求了一个比必要的更复杂的答案。欣赏这个简单的解决方案!
【解决方案2】:

试试这个方法:

data = [
(0.862, 'beehive', 'bug'),
(0.12, 'yard', 'property'),
(0.0, 'lake', 'mailbox'),
(0.37, 'maintenance', 'shears'),
(0.1666, 'summer', 'popsicle'),
(0.9, 'poplar', 'tree')
]

print(*reversed(sorted(data)))

输出:

(0.9, 'poplar', 'tree') (0.862, 'beehive', 'bug') (0.37, 'maintenance', 'shears') (0.1666, 'summer', 'popsicle') (0.12, 'yard', 'property') (0.0, 'lake', 'mailbox')

或者,您可以遵循另一个流程:

>>> data = [
... (0.862, 'beehive', 'bug'),
... (0.12, 'yard', 'property'),
... (0.0, 'lake', 'mailbox'),
... (0.37, 'maintenance', 'shears'),
... (0.1666, 'summer', 'popsicle'),
... (0.9, 'poplar', 'tree')
... ]
>>> data.sort(key=lambda tup: tup[0], reverse = True)
>>> data
[(0.9, 'poplar', 'tree'), (0.862, 'beehive', 'bug'), (0.37, 'maintenance', 'shears'), (0.1666, 'summer', 'popsicle'), (0.12, 'yard', 'property'), (0.0, 'lake', 'mailbox')]
>>>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2020-08-02
    • 1970-01-01
    相关资源
    最近更新 更多