簡體   English   中英

將dict從鍵/值對擴展到Python中的鍵/值對

[英]Extend dict from key/values pair to key/value pair in Python

myDict = {'121': ['adrian', 'alex', 'peter'], '122': ['john', 'vic', 'bill']}

我想“擴展”我的字典,以便每個鍵/值對都包含一個值,而不是列表。 嘗試使用myDict.keys()和myDict.values()進行迭代,並構造新的字典,但沒有解決(我對python3還是很陌生)。 這是我要實現的目標:

myNewDict = {'121': 'adrian', '121': 'alex', '121': 'peter', '122': 'john', '122': 'vic', '122':'bill'}

如果您不關心碰撞被破壞,這里是一線解決方案(加上導入):

import functools                                                                   
myDict = {'121': ['adrian', 'alex', 'peter'], '122': ['john', 'vic', 'bill']}   

print(functools.reduce( lambda x,y: dict(x, **y), (dict(map(lambda x: (x,i), myDict[i])) for i in myDict)))

打破這是做什么的:

# This is a generator that creates a new dictionary out of each key/valuelist

(dict(map(lambda val: (val,key), myDict[key])) for key in myDict)

# => {'adrian': '121', 'alex': '121': 'peter': '121'}
# => {'john': '122', 'bill': '122', 'vic': '122'}

一旦有了,那就打電話

functools.reduce( lambda x,y: dict(x, **y), <generator here>)

減少功能並應用

從左到右累積到序列項,以便將序列減少為單個值。

dict(mydict, **yourdict)通過參數解包的方式組合字典。

這意味着它將從列表中選取第一個詞典,然后將其與列表中的下一個詞典進行合並,如此反復進行直到列表中的所有詞典都合並為一個完整的詞典為止。


話雖這么說,我可能會做這樣的事情:

inverted = dict((name, k) for k, v in myDict.items() for name in v) 

使用字典理解的替代語法:

inverted = {name: k for k, v in myDict.items() for name in v}

根據上面的評論,這是如何反轉字典並為每個鍵允許多個值的方法:

from collections import defaultdict
myNewDict = defaultdict(list)
for staff_id, names in myDict.items():
    for name in names:
        myNewDict[name].append(staff_id)

如果順序無關緊要,則可以使用setadd而不是listappenddefaultdict

from collections import defaultdict
myNewDict = defaultdict(set)
for staff_id, names in myDict.items():
    for name in names:
        myNewDict[name].add(staff_id)

暫無
暫無

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

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