我有一个元组列表:
[('g', 10, 2), ('o', 6, 11), ('v', 2, 4), ('t', 1, 15), ('x', 40, 3), ('m', 4, 4), ('k', 10, 2), ('f', 14, 1), ('p', 70, 90), ('l', 21, 7), ('n', 1, 27), ('a', 39, 70), ('d', 11, 10), ('h', 21, 10), ('c', 10, 19), ('b', 8, 1), ('e', 30, 39), ('i', 23, 29), ('r', 8, 7), ('q', 2, 2), ('s', 18, 86)]
我正在努力解决如何对它们进行排序,以便它们可以这样放置:
[('p', 70, 90), ('a', 39, 70), ('s', 18, 84), ('è', 27, 45), ('e', 30, 39), ('i', 23, 29), ('x', 40, 3), ('h', 21, 10), ('c', 10, 19), ('l', 20, 7), ('d', 11, 10), ('o', 6, 11), ('t', 1, 15), ('f', 14, 1), ('r', 8, 7), ('g', 10, 2), ('k', 10, 2), ('n', 1, 11), ('b', 8, 1), ('m', 4, 4), ('v', 2, 4), ('q', 2, 2)]
它应该是元组的第二个和第三个元素的添加,当它们是相同的ex时。 (a,10,9)
和(b,9,10)
应按字母顺序对其进行排序。它是用python 3.5编写的,我无法调用任何库
答案 0 :(得分:6)
您可以将元组设置为对列表进行排序的键:
sorted(lst, key = lambda x: (sum(x[1:]), x[0]))
通过这种方式,它首先按元组的最后两个元素的总和,然后按元组的第一个元素进行排序。
如果你喜欢降序的结果,正如@Moses评论的那样,你可以指定reverse
参数为True
:
sorted(lst, key = lambda x: (sum(x[1:]), x[0]), reverse = True)
更新:
要以不同方式处理降序,升序,因为sum
此处为数字,您也可以否定sum
。通过这种方式,它将按sum
的降序排序,但按字母顺序排列第一个字母。
sorted(lst, key = lambda x: (-sum(x[1:]), x[0]))
答案 1 :(得分:3)
sorted(a, key=lambda x: (sum(x[1:3]), x[0]))
a
是您的清单。如果你需要逆转:
sorted(a, key=lambda x: (sum(x[1:3]), x[0]), reverse=True)
答案 2 :(得分:0)
a = [('g', 10, 2), ('o', 6, 11), ('v', 2, 4), ('t', 1, 15),
('x', 40, 3), ('m', 4, 4), ('k', 10, 2), ('f', 14, 1),
('p', 70, 90), ('l', 21, 7), ('n', 1, 27), ('a', 39, 70),
('d', 11, 10), ('h', 21, 10), ('c', 10, 19), ('b', 8, 1),
('e', 30, 39), ('i', 23, 29), ('r', 8, 7), ('q', 2, 2),
('s', 18, 86)]
Create a function that will return the sum of the items并使用该函数作为排序键。我喜欢在从iterables中提取项目时使用operator.itemgetter()。
import operator
second_third_first_items = operator.itemgetter(1, 2, 0)
def key(thing):
*two_three, one = second_third_first_items(thing)
return (sum(two_three), one)
a.sort(key = key, reverse = True)
key
没有operator.itemgetter
def key(thing):
one, *two_three = thing[:3]
return (sum(two_three), one)