通过添加元组的第二个和第三个元素对元组列表进行排序

时间:2016-11-02 16:09:36

标签: python list sorting

我有一个元组列表:

[('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编写的,我无法调用任何库

3 个答案:

答案 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)