我目前正在處理初學者的任務(在 Python 中):“反轉字典:鍵變成值,值變成鍵。原始值是串列,當轉換為鍵時,不能重復!”
首先,我必須寫出我見過幾個(類似的)問題,但沒有一個適用于我的任務。
其次,我嘗試使用嵌套的 for 和 if 回圈撰寫解決方案 - 未成功。
然后,在應用 Internet 解決方案后,我撰寫了此代碼:
def invert(dict1):
invertedDict1 = dict()
invertedDict1 = {value: key for key in dict1 for value in dict1[key]}
#print(dict1)
print(invertedDict1)
dict1 = {1: [2, 3, 5],
2: [1, 4],
3: [1, 2],
}
invert(dict1)
輸出:
{2: 3, 3: 1, 5: 1, 1: 3, 4: 2}
它應該是:
{1:[2,3], 2:[1,3], 3:[1], 4:[2], 5:[1]}
有人知道我在哪里犯了錯誤(或錯誤)?
PS 我是 Python 的新手并且來自 C/C 背景,所以請理解我缺乏 Python 特定的知識
謝謝!
uj5u.com熱心網友回復:
您的構造問題是關鍵重復項,這在 dict 中是不允許的。您的代碼中也沒有關于串列(對于值)的任何內容。
方法是使用 a defaultdict, with listas 值。如果鍵不存在,它會放置一個空串列,然后key在其中附加。
from collections import defaultdict
def invert(dict1):
invertedDict1 = defaultdict(list)
for key, values in dict1.items():
for value in values:
invertedDict1[value].append(key)
return invertedDict1
dict1 = {1: [2, 3, 5], 2: [1, 4], 3: [1, 2], }
print(invert(dict1)) # {2: [1, 3], 3: [1], 5: [1], 1: [2, 3], 4: [2]}
uj5u.com熱心網友回復:
你可以很容易地做到這一點defaultdict:
from collections import defaultdict
d = defaultdict(list)
for k, v in dict1.items():
for x in v:
d[x].append(k)
print(d)
defaultdict(list, {2: [1, 3], 3: [1], 5: [1], 1: [2, 3], 4: [2]})
defaultdict(list)list訪問鍵時將始終回傳 a :一個新的空串列,[]如果這是第一次d[x]訪問,則[k1, k2, ...]與xif關聯的現有值串列d[x]之前已被訪問過。
這樣您就可以將所有k關聯的鍵存盤x在您的串列中
uj5u.com熱心網友回復:
azro 的回答非常好,但我只想添加一個實作,collections如果它沒有幫助。dict.setdefault(default=[])如果需要,我將使用插入新串列,否則獲取現有串列。
def invert(d):
inverted = {}
for k, v in d.items():
for x in v:
L = inverted.setdefault(x, [])
L.append(k)
return inverted
dict1 = {1: [2, 3, 5], 2: [1, 4], 3: [1, 2]}
print(invert(dict1)) # -> {2: [1, 3], 3: [1], 5: [1], 1: [2, 3], 4: [2]}
這條線setdefault代表這個:
if x not in inverted:
inverted[x] = []
L = inverted[x]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/322318.html
下一篇:忽略元素的遞回函式-python
