按键排序字典,但也显示键的值 - Python

时间:2015-11-26 18:36:36

标签: python sorting dictionary

我有一个包含排行榜的字典。字典中的键是名称,键定义是用户的分数。

例如,如果我打印它输出的字典:

{'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,这似乎是一个很好的尝试方法,虽然我不确定如何实现它。

3 个答案:

答案 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.formatstr.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)])

更新1

按字母顺序打印最后三个(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])})

更新2

或者,如果您想将列表限制为三个:

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个元素。

更新2

使用most_recent_keys

# Prints the last 3 items added
for key in sorted(most_recent_keys):
    print('{} = {}'.format(key, d[key]))

更新3

我知道您希望将字典的值限制为列表中的前三个。要做到这一点:

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]}

更新4

根据您的要求保存字典副本:

new_d = {k: v[:3] for k, v in d.items()}

现在,new_d就像好的d,但是值被截断为前三项。然后你可以用它做你想做的事。