簡體   English   中英

按鍵對字典進行排序,但還顯示鍵的值-Python

[英]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.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]}

在旁注中,如果您想對字典鍵進行排序,則只需調用在字典中排序的鍵即可,無需調用.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)]) 

更新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]

反正你懂這個意思...

字典是無序的,這意味着鍵沒有排序。 如果您的目標是打印按鍵排序的字典,請考慮使用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個元素。

更新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 ,但被截斷的前三個項目的價值。 然后,您可以使用它來做您想做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM