通过First Element Float排序包含字符串的元组列表(Python)

时间:2017-08-03 18:42:56

标签: python list sorting floating-point tuples

我有很长的元组列表:

[...
(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"

任何人都可以详细说明为什么列表仍然无序,尽管这些排序尝试以及可能按浮点顺序排序的内容是什么?

2 个答案:

答案 0 :(得分:3)

sorted(..)会返回列表。您要查找的是.sort(..)对列表 inplace 进行排序。

此外,您可以使用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')]

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

如果你不想要这个领带破坏者,但在这种情况下使用原始顺序,你可以使用itemgetter作为key

from operator import itemgetter

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

如果要构建已排序的 new 列表,可以将相同的参数与sorted(..)一起使用:

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

答案 1 :(得分:0)

尝试这种方式:

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')]
>>>