[英]Sorting a dictionary by key but also display the key's value - Python
我有一本包含排行榜的字典。 它們在字典中的鍵是名稱,鍵的定義是用戶的分數。
例如,如果我打印字典,它將輸出:
{'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,盡管我不確定如何實現它,但這似乎是嘗試的好方法。
對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]}
在旁注中,如果您想對字典鍵進行排序,則只需調用在字典中排序的鍵即可,無需調用.keys。 同樣,如果您的字符串全部為大寫字母,則無需使用str.lower
作為排序的鍵。
使用collections.OrderedDict
,引用文檔 :
由於有序字典會記住其插入順序,因此可以將其與排序結合使用以創建排序后的字典:
>>> # 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]
反正你懂這個意思...
字典是無序的,這意味着鍵沒有排序。 如果您的目標是打印按鍵排序的字典,請考慮使用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
數據結構。 要初始化后三個附加鍵的列表:
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
,但被截斷的前三個項目的價值。 然后,您可以使用它來做您想做的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.