python - 仅当元组中的数字相等时,如何根据字母顺序排列此列表中的元组?

标签 python list sorting tuples

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.arrivillaga在评论中,这样效率更高:

>>> 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 值进行排序,然后比较 b 值(如果有两个 a 值相等。除非另有说明,排序始终按升序排列。如果你有一堆数字 [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)]

了解如何操作关键函数的列表:

>>> [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)]

关于python - 仅当元组中的数字相等时,如何根据字母顺序排列此列表中的元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42183970/

相关文章:

python - 组合两个数据帧时保留索引

python - 将整数添加到列表中所有非整数元素

python - `extend` 比 `+=` 快吗?

按值对 CouchDB View 进行排序

javascript - 使用 Split 函数对 Javascript 数组进行排序

python - Numba 函数与类型参数的使用无效

python - 错误 Python - 214702489 访问被拒绝 (COM) 已更新

Python 二维数组 bool 值缩减

java - 如何使用java对对象列表进行排序

c++ - C++中的计数排序