簡體   English   中英

如何對鍵進行排序:按列表中的值列出字典?

[英]How do I sort a key:list dictionary by values in list?

我有一本字典

mydict = {'name':['peter', 'janice', 'andy'], 'age':[10, 30, 15]}

如何根據key ==“name”列表對此詞典進行排序?

最終結果應該是:

mydict = {'name':['andy', 'janice', 'peter'], 'age':[15, 30, 10]}

或者字典是這種數據的錯誤方法?

如果您操縱數據,通常有助於每列成為觀察變量(名稱,年齡),每行都是觀察(例如抽樣人員)。 有關此PDF鏈接中 整潔數據的更多信息

糟糕的程序員擔心代碼。 優秀的程序員擔心數據結構及其關系--Linus Torvalds

字典列表更適合這樣的操作。 下面我介紹一個適合初學者的片段來整理你的數據。 一旦擁有了良好的數據結構,即使對於初學者來說,按任何變量排序也是微不足道的。 沒有單線Python功夫:)

>>> mydict = {'name':['peter', 'janice', 'andy'], 'age':[10, 30, 15]}

讓我們首先研究一個更好的數據結構

>>> persons = []
>>> for i, name in enumerate(mydict['name']):
...     persons.append({'name': name, 'age': mydict['age'][i]})
... 
>>> persons
[{'age': 10, 'name': 'peter'}, {'age': 30, 'name': 'janice'}, {'age': 15, 'name': 'andy'}]

現在,更容易處理這種類似於數據分析環境中的“數據幀”的數據結構。 讓我們按person.name排序

>>> persons = sorted(persons, key=lambda person: person['name'])

現在,如果您願意,請將其恢復為您的格式

>>> {'name': [p['name'] for p in persons], 'age': [p['age'] for p in persons]}
{'age': [15, 30, 10], 'name': ['andy', 'janice', 'peter']}

zip用於制作元組(名稱,年齡)

dict = {'name':[], 'age':[]}
for name, age in sorted(zip(mydict['name'], mydict['age'])):
    dict['name'].append(name)
    dict['age'].append(age)

輸出:

{'age': [15, 30, 10], 'name': ['andy', 'janice', 'peter']}

兩行版本:

>>> s = sorted(zip(mydict['name'], mydict['age']))
>>> dict([('name', [x[0] for x in s]), ('age', [x[1] for x in s])])
{'age': [15, 30, 10], 'name': ['andy', 'janice', 'peter']}

你可以使用defaultdict為了更快的性能 )和zip - 首先將person拉鏈到相應的age然后排序,然后生成defaultdict和字典理解。

from collections import defaultdict
dd= defaultdict(list)
mydict = {'name':['peter', 'janice', 'andy'], 'age':[10, 30, 15]}
d=zip(mydict['name'],mydict['age'])

for i in sorted(d,key=lambda x: x[0]):
    dd['names'].append(i[0])
    dd['age'].append(i[1])
print {k:v for k,v in dd.items()}

輸出 -

{'age': [15, 30, 10], 'names': ['andy', 'janice', 'peter']}

是的,也許你對詞典的方法並不是最好的。在這里你只是將列表存儲在一個詞典中。 但您也可以使用列表來存儲這些列表。 這幾乎是一樣的我首先建議的是dict dict。

myPeople = {}
myPeople["peter"] = {"age":20, "country" : "USA"}
myPeople["john"] = {"age":30, "country" : "newzealand"}
myPeople["fred"] = {"age":32, "country" : "France"}
# or if you have only one descript per name to store, 
# you may use only a dict
# myPeopleName["peter"] = 20
# myPeopleName["john"] = 30

#then you iterate the dictionnary as before and the result will be print
# out sorted by key

for k in sorted(myPeople.keys()): 
    print myPeople[k]

編輯:我的代碼完全錯了。 並且集合不按鍵排序值,但保留您在字典中添加的鍵的順序。

暫無
暫無

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

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