繁体   English   中英

如何按几个键对元组列表进行排序

[英]How to sort list of tuples by several keys

我正在做一个关于 Python 的练习并列出一个问题:我有一个按第二个键排序的元组列表:

[('f', 3), ('a', 3), ('d', 3), ('b', 2), ('c', 2)]

我需要对它进行排序:按数字排序的第二个值和按字母顺序排列的第一个值。 它必须看起来像:

[('a', 3), ('d', 3), ('f', 3), ('b', 2), ('c', 2)]

当我使用sorted函数时,我得到了:

[('a', 3), ('b', 2), ('c', 2), ('d', 3), ('f', 3)]

它按第一个元素排序(我丢失了第二个元素的排列)。 我也尝试使用key

def getKey(item):
  return item[0]
a = (sorted(lis, key=getKey))

它也没有帮助我。

def getKey(item):
    return item[0]

这将返回元组的第一个元素,因此列表将按第一个元组元素排序。 您想按第二个元素排序,然后是第一个,因此您想反转元组。 您的关键功能将需要是:

def getKey(item):
    return -item[1], item[0]

做最后的决定:

>>> sorted(lis, key=getKey)
[('a', 3), ('d', 3), ('f', 3), ('b', 2), ('c', 2)]
l = [('f', 4), ('b', 4), ('a', 4), ('c', 3), ('k', 1)]
l.sort(key=lambda x:(-x[1],x[0]))
print(l)
[('a', 4), ('b', 4), ('f', 4), ('c', 3), ('k', 1)]

我们将两个键传递给 sort -x[1] ,它将按负号从最高到最低的数字排序反转,然后我们打破与x[0]关系, x[0]从最低到最高排序,即 az 自然。

`

当您有一个包含嵌套元组的列表时,您无法通过查看两个元素sort对其进行sort 你的情况您可以sort按字母顺序或数字顺序。 sort方法的key参数让您指定要按元组对中的哪个元素对数据进行排序。

如果要按数字顺序增加排序:

alist = [('f', 3), ('a', 3), ('d', 3), ('b', 2), ('c', 2)]
alist.sort(key=lambda pair: pair[1])

如果要按数字顺序递减排序:

alist = [('f', 3), ('a', 3), ('d', 3), ('b', 2), ('c', 2)]
alist.sort(key = lambda pair: pair[1], reverse=True)

如果要按字母顺序排序:

alist = [('f', 3), ('a', 3), ('d', 3), ('b', 2), ('c', 2)]
alist.sort()

颠倒字母顺序:

alist = [('f', 3), ('a', 3), ('d', 3), ('b', 2), ('c', 2)]
alist.sort(reverse = True)

key参数让您指定要作为排序依据的元组对的哪个元素。 您不能同时按字母顺序和数字顺序排序。

正确答案:

l = [('f', 4), ('b', 4), ('a', 4), ('c', 3), ('k', 1)]
l.sort(key=lambda x:(-x[1],x[0]))
print(l)

结果: [('a', 4), ('b', 4), ('f', 4), ('c', 3), ('k', 1)]

sort()方法是稳定的。 调用两次,首先是次键(按字母顺序),然​​后是主键(数字):

>>> lst = [('f', 3), ('a', 3), ('d', 3), ('b', 2), ('c', 2)]
>>> lst.sort()
>>> lst.sort(key=lambda kv: kv[1], reverse=True)
>>> lst
[('a', 3), ('d', 3), ('f', 3), ('b', 2), ('c', 2)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM