我有很长的元组列表:
[...
(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"
任何人都可以详细说明为什么列表仍然无序,尽管这些排序尝试以及可能按浮点顺序排序的内容是什么?
答案 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')]
>>>