我有一个包含排行榜的字典。字典中的键是名称,键定义是用户的分数。
例如,如果我打印它输出的字典:
{'Bill': [23], 'T': [5], 'Zanggangwang': [3], 'Tom': [0, 12, 13, 8, 9, 1, 9]}
我想按字母顺序对此进行排序,以便在打印时按字母顺序排序。它显示如下:
{'Bill': [23], 'T': [5], 'Tom': [0, 12, 13, 8, 9, 1, 9], 'Zanggangwang': [3]}
(The keys are alphabetical)
我尝试使用:
sortednames=sorted(c.keys(), key=lambda x:x.lower())
虽然这只是按字母顺序打印键名而不是键名和定义;
['Bill', 'T', 'Tom', 'Zanggangwang']
如何按字母顺序对此进行排序并仍显示分数?
我对python很陌生,并且非常感谢您提供一个很好的解释来帮助您提供解决方案。
为了回应Hai Vu,我尝试使用你建议的方法:
#And then I tried printing the list although it seems to print:
deque(['Zanggangwang', 'Tom', 'T'], maxlen=3)
我做错了什么? 我看过ordereDict,这似乎是一个很好的尝试方法,虽然我不确定如何实现它。
答案 0 :(得分:1)
排序items
,您只是对键进行排序:
d = {'Bill': [23], 'T': [5], 'Zanggangwang': [3], 'Tom': [0, 12, 13, 8, 9, 1, 9]}
# x[0] -> the dict keys
print(sorted(d.items(), key=lambda x: x[0].lower()))
[('Bill', [23]), ('T', [5]), ('Tom', [0, 12, 13, 8, 9, 1, 9]), ('Zanggangwang', [3])]
您无法对字典进行排序,因此如果您希望输出类似于字典文字,则可以使用排序的项目str.format
和str.join
进行排序:
srtd = sorted(d.items(), key=lambda x: x[0].lower())
print("{{{}}}".format(", ".join(["{}: {}".format(k, v) for k, v in srtd])))
输出:
{Bill: [23], T: [5], Tom: [0, 12, 13, 8, 9, 1, 9], Zanggangwang: [3]}
在旁注中,如果要对dicts键进行排序,只需在dict中调用sort,就不需要调用.keys。此外,如果您的字符串全部为大写,则无需使用str.lower
作为排序的键。
答案 1 :(得分:1)
使用collections.OrderedDict
,引用documentation:
由于有序字典会记住其插入顺序,因此可以与排序结合使用以生成排序字典:
>>> # regular unsorted dictionary >>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} >>> # dictionary sorted by key >>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) >>> # dictionary sorted by value >>> OrderedDict(sorted(d.items(), key=lambda t: t[1])) OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) >>> # dictionary sorted by length of the key string >>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
按字母顺序打印最后三个(Python 3):
from collections import OrderedDict
d = OrderedDict()
d["Bill"] = [23]
d["T"] = [5]
d["Zanggangwang"] = [3]
d["Tom"] = [0, 12, 13, 8, 9, 1, 9]
for k in sorted(list(reversed(d))[0:3]):
print(k, d[k])
给出:
T [5]
Tom [0, 12, 13, 8, 9, 1, 9]
Zanggangwang [3]
因此,比尔已经离开,其他三个按键排序。或者,如果必须,将它们放回OrderDict:
OrderedDict({k: d[k] for k in sorted(list(reversed(d))[0:3])})
或者,如果您想将列表限制为三个:
for k in sorted(list(reversed(d))[0:3]):
print(k, d[k][:3])
给出:
T [5]
Tom [0, 12, 13]
Zanggangwang [3]
嗯,你明白了......
答案 2 :(得分:0)
字典是无序的,这意味着密钥没有排序。如果您的目标是打印按键排序的字典,请考虑使用pprint模块,例如:
import pprint
d = {'Bill': [23], 'T': [5], 'Zanggangwang': [3], 'Tom': [0, 12, 13, 8, 9, 1, 9]}
pprint.pprint(d)
输出:
{'Bill': [23], 'T': [5], 'Tom': [0, 12, 13, 8, 9, 1, 9], 'Zanggangwang': [3]}
请注意,如果字典很长,那么输出可能会跨越几行。如果您要打印到文件,请考虑pprint.pformat
如果你想跟踪追加的最后3个密钥,你必须自己这样做,因为字典不能跟踪最后添加的密钥。以下是一个建议:使用collections.deque
数据结构。要初始化最后3个附加键的列表:
import collections
most_recent_keys = collections.deque(maxlen=3)
添加到词典时,例如,添加'John', [4]
:
d['John'] = [4]
most_recent_keys.append('John')
most_recent_keys
的行为类似于常规列表,但初始化时大小限制为3个元素。
使用most_recent_keys
:
# Prints the last 3 items added
for key in sorted(most_recent_keys):
print('{} = {}'.format(key, d[key]))
我知道您希望将字典的值限制为列表中的前三个。要做到这一点:
import pprint
d = {'Bill': [23], 'T': [5], 'Zanggangwang': [3], 'Tom': [0, 12, 13, 8, 9, 1, 9]}
pprint.pprint(d) # Prints everything
print('---')
pprint.pprint({k: v[:3] for k, v in d.items()}) # Prints only first 3
输出:
{'Bill': [23], 'T': [5], 'Tom': [0, 12, 13, 8, 9, 1, 9], 'Zanggangwang': [3]}
---
{'Bill': [23], 'T': [5], 'Tom': [0, 12, 13], 'Zanggangwang': [3]}
根据您的要求保存字典副本:
new_d = {k: v[:3] for k, v in d.items()}
现在,new_d
就像好的d
,但是值被截断为前三项。然后你可以用它做你想做的事。