如果出现一次,则按值对字典进行排序,否则按键进行排序
Sorting a dictionary by values if it occurs once otherwise by keys
我有这本词典,我需要按值对单词进行排序。但是当两个或多个单词具有相同的值时,我需要按字母对这些单词进行排序,但我不知道该怎么做。你能帮帮我吗?
dict = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
'violet': 2, 'GRAY': 3, 'White': 6}
提前致谢
利用 tuple
逐一比较其元素的事实。
d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
'violet': 2, 'GRAY': 3, 'White': 6}
result = sorted(d, key=lambda k: (d[k], k.lower()))
还修复了 dict
不应用作变量名 - 它是内置类型。
使用sorted
:
>>> d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
'violet': 2, 'GRAY': 3, 'White': 6}
>> sorted(d, key=lambda i: (d[i], i.lower()))
['BLACK', 'brown', 'RED', 'violet', 'GRAY', 'BLUE', 'orange', 'green', 'White', 'YELLOW']
注意:这假定一切都应该是小写的,因为 python 将大写单词排在小写单词之前。
我还把你的变量重命名为 d
因为 dict
是内置的。
分解正在发生的事情:
sorted
在字典上 returns 由提供的函数 key
排序的键(默认是键的直接比较)
>>> sorted(d)
['BLACK', 'BLUE', 'GRAY', 'RED', 'White', 'YELLOW', 'brown', 'green', 'orange', 'violet']
要按值排序,请使用 dict.get
:
>>> sorted(d, key=d.get)
['BLACK', 'brown', 'RED', 'violet', 'GRAY', 'orange', 'BLUE', 'green', 'White', 'YELLOW']
如果出现平局,我们必须按关键字排序。因为 python 一个一个地比较它的元组,我们可以构造一个 (value, key)
的元组,它会比较项目,如果它们相同,它会比较项目。
>>> (4, "blue") < (4, "orange")
True
>>> (4, "blue") < (3, "orange")
False
你可以试试这个:
>>> d = {'BLUE': 4, 'brown': 1, 'BLACK': 0, 'YELLOW': 7, 'violet': 2, 'orange': 4, 'green': 5, 'White': 6, 'GRAY': 3, 'RED': 2}
>>> t = (zip(d.values(), d.keys()))
>>> sorted(t)
[(0, 'BLACK'), (1, 'brown'), (2, 'RED'), (2, 'violet'), (3, 'GRAY'), (4, 'BLUE'), (4, 'orange'), (5, 'green'), (6, 'White'), (7, 'YELLOW')]
使用collections.OrderedDict
,您可以构造一个有序映射,它仍然具有字典的优点,例如 O(1) 查找。
from collections import OrderedDict
d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7,
'green': 5, 'BLUE': 4, 'violet': 2, 'GRAY': 3, 'White': 6}
od = OrderedDict(sorted(d.items(), key=lambda x: (x[1], x[0].casefold())))
print(od)
OrderedDict([('BLACK', 0), ('brown', 1), ('RED', 2), ('violet', 2), ('GRAY', 3),
('BLUE', 4), ('orange', 4), ('green', 5), ('White', 6), ('YELLOW', 7)])
由于您同时使用键和值进行排序,因此最好使用 dict.items
中的元组进行排序。此外,使用 str.casefold
进行不区分大小写的排序。
最后,永远不要隐藏 dict
等内置函数。使用 dict_
或 d
代替变量名。
我有这本词典,我需要按值对单词进行排序。但是当两个或多个单词具有相同的值时,我需要按字母对这些单词进行排序,但我不知道该怎么做。你能帮帮我吗?
dict = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
'violet': 2, 'GRAY': 3, 'White': 6}
提前致谢
利用 tuple
逐一比较其元素的事实。
d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
'violet': 2, 'GRAY': 3, 'White': 6}
result = sorted(d, key=lambda k: (d[k], k.lower()))
还修复了 dict
不应用作变量名 - 它是内置类型。
使用sorted
:
>>> d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
'violet': 2, 'GRAY': 3, 'White': 6}
>> sorted(d, key=lambda i: (d[i], i.lower()))
['BLACK', 'brown', 'RED', 'violet', 'GRAY', 'BLUE', 'orange', 'green', 'White', 'YELLOW']
注意:这假定一切都应该是小写的,因为 python 将大写单词排在小写单词之前。
我还把你的变量重命名为 d
因为 dict
是内置的。
分解正在发生的事情:
sorted
在字典上 returns 由提供的函数 key
排序的键(默认是键的直接比较)
>>> sorted(d)
['BLACK', 'BLUE', 'GRAY', 'RED', 'White', 'YELLOW', 'brown', 'green', 'orange', 'violet']
要按值排序,请使用 dict.get
:
>>> sorted(d, key=d.get)
['BLACK', 'brown', 'RED', 'violet', 'GRAY', 'orange', 'BLUE', 'green', 'White', 'YELLOW']
如果出现平局,我们必须按关键字排序。因为 python 一个一个地比较它的元组,我们可以构造一个 (value, key)
的元组,它会比较项目,如果它们相同,它会比较项目。
>>> (4, "blue") < (4, "orange")
True
>>> (4, "blue") < (3, "orange")
False
你可以试试这个:
>>> d = {'BLUE': 4, 'brown': 1, 'BLACK': 0, 'YELLOW': 7, 'violet': 2, 'orange': 4, 'green': 5, 'White': 6, 'GRAY': 3, 'RED': 2}
>>> t = (zip(d.values(), d.keys()))
>>> sorted(t)
[(0, 'BLACK'), (1, 'brown'), (2, 'RED'), (2, 'violet'), (3, 'GRAY'), (4, 'BLUE'), (4, 'orange'), (5, 'green'), (6, 'White'), (7, 'YELLOW')]
使用collections.OrderedDict
,您可以构造一个有序映射,它仍然具有字典的优点,例如 O(1) 查找。
from collections import OrderedDict
d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7,
'green': 5, 'BLUE': 4, 'violet': 2, 'GRAY': 3, 'White': 6}
od = OrderedDict(sorted(d.items(), key=lambda x: (x[1], x[0].casefold())))
print(od)
OrderedDict([('BLACK', 0), ('brown', 1), ('RED', 2), ('violet', 2), ('GRAY', 3),
('BLUE', 4), ('orange', 4), ('green', 5), ('White', 6), ('YELLOW', 7)])
由于您同时使用键和值进行排序,因此最好使用 dict.items
中的元组进行排序。此外,使用 str.casefold
进行不区分大小写的排序。
最后,永远不要隐藏 dict
等内置函数。使用 dict_
或 d
代替变量名。