[英]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.