clip = [('b', 12), ('e', 10),('d', 11),('a',12),('c', 10),('g',18)]
在此列表中,编号最高的字母应首先打印,即按升序打印。现在,如果两个字母的数字相同,那么英语字母表中第一个字母应该先打印出来,然后相应地打印下一个。我该怎么做?上面的列表应该这样打印:
clip = [('g',18),('a',12),('b',12),('d',11),('c',10),('e',10)]
我尝试了我所知道的大多数排序方法,比如:
sorted(clip.items(), key = lambda x:(x[0],x[1]))
Python的sorted()
是稳定的,所以先按字母表排序,然后按数字排序。
>>> clip = [('b', 12), ('e', 10),('d', 11),('a',12),('c', 10),('g',18)]
>>> sorted(sorted(clip), key=lambda x:x[1], reverse=True)
[('g', 18), ('a', 12), ('b', 12), ('d', 11), ('c', 10), ('e', 10)]
根据juanpa.arrivilaga在评论中的说法,这更有效:
>>> sorted(clip, key=lambda x:(-x[1], x[0]))
[('g', 18), ('a', 12), ('b', 12), ('d', 11), ('c', 10), ('e', 10)]
理解-x[1]
:的一些帮助
元组(a,b)
通过比较a
值,然后在两个a
值相等的情况下比较b
值来排序。除非另有说明,否则排序总是按升序进行。如果你有一堆数字,[1,2,3]
,并且你想反向排序,你可以告诉python它们的实际值是* -1
:[-1,-2,-3]
。现在,对它们进行排序将产生最小到最大的[-3,-2,-1]
。当我们传递一个否定数字的key
函数时,我们传递的是这些负数,[-1,-2,-3]
作为[1,2,3]
的替代值进行比较。以下是一些命令,您可以在python解释器中键入这些命令来直接学习:
$ python3
Python 3.5.2 (default, Nov 14 2016, 15:04:53)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [(3,20), (1,40), (4,10), (2,30)]
了解如何操作key
函数的列表:
>>> [x[0] for x in a]
[3, 1, 4, 2]
>>> [x[1] for x in a]
[20, 40, 10, 30]
>>> [-x[0] for x in a]
[-3, -1, -4, -2]
>>> [(x[1],x[0]) for x in a]
[(20, 3), (40, 1), (10, 4), (30, 2)]
使用我们上面学到的排序。请记住,在排序时,键值只是实际值的临时替代:
>>> sorted(a)
[(1, 40), (2, 30), (3, 20), (4, 10)]
>>> sorted(a, key=lambda x: -x[0])
[(4, 10), (3, 20), (2, 30), (1, 40)]
>>> sorted([(x[1],x[0]) for x in a])
[(10, 4), (20, 3), (30, 2), (40, 1)]
>>> sorted([(-x[1],x[0]) for x in a])
[(-40, 1), (-30, 2), (-20, 3), (-10, 4)]
key
函数不一定有意义。这个总是返回0,因此列表保持原来的顺序。
>>> sorted(a, key=lambda x: 0)
[(3, 20), (1, 40), (4, 10), (2, 30)]
最后一位,key=lambda x:(-x[1], x[0])
技巧只适用于可以取反的数字或事物。如果我们再次尝试对您的列表进行排序,但反过来按降序字母和升序排序,-1
技巧将不再有效:
>>> clip = [('b', 12), ('e', 10),('d', 11),('a',12),('c', 10),('g',18)]
第一个字段,依次为字母和数字
>>> sorted(clip, key=lambda x: (-x[0], x[1]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
TypeError: bad operand type for unary -: 'str'
首先按颠倒的字母排序
>>> sorted(clip, reverse=True)
[('g', 18), ('e', 10), ('d', 11), ('c', 10), ('b', 12), ('a', 12)]
然后是数字
>>> sorted(sorted(clip, reverse=True), key=lambda x: x[1])
[('e', 10), ('c', 10), ('d', 11), ('b', 12), ('a', 12), ('g', 18)]