的Python問題的字典清單:將值設置爲默認值
我有一個默認的字典/快譯通,說a[1] = (1,2,3)
這樣a[1][0] = 1
等。 現在我想添加到同一個鍵值的列表。請理解,我不想追加,但在同一個列表中添加更多值。例如,我想5添加到該鍵的[1],但只能在單一的名單,因此:
a[1][1].append("5") = (1, [2,5], 3)
有什麼可以幫助我做到這一點?
的Python問題的字典清單:將值設置爲默認值
我有一個默認的字典/快譯通,說a[1] = (1,2,3)
這樣a[1][0] = 1
等。 現在我想添加到同一個鍵值的列表。請理解,我不想追加,但在同一個列表中添加更多值。例如,我想5添加到該鍵的[1],但只能在單一的名單,因此:
a[1][1].append("5") = (1, [2,5], 3)
有什麼可以幫助我做到這一點?
你問:
嗯,我有一個字典,我想更多的值添加到相同的密鑰。這是可能的嗎?
不直接。一個字典每個鍵總是隻有一個值。使用defaultdict不會改變這一點。
但是,通常的方式模擬一個字符串,每個鍵有多個值(有些語言稱爲「multidict」)是僅使用這些多個值的列表作爲單個值。例如:
>>> d = {'a': [0, 1, 2], 'b': [1, 2, 3]}
>>> d['a'].append(3)
>>> d['a']
>>> [0, 1, 2, 3]
您似乎使用元組而不是列表。你可以這樣做,但是,因爲元組是不可變的,所以你不能在它們上調用append
;你必須用新的更大的元組替換它們。像這樣:
>>> d = {'a': (0, 1, 2), 'b': (1, 2, 3)}
>>> d['a'] = d['a'] + (3,)
>>> d['a']
>>> (0, 1, 2, 3)
這使得代碼比使用列表更復雜一點,但它可以工作。
同時,使用defaultdict
在這裏完全沒有關係。所有defaultdict
會自動處理密鑰不存在的情況。例如:
>>> d = {'b': (1, 2, 3)}
>>> d['a'] = d['a'] + (3,)
KeyError: 'a'
>>> d = defaultdict(tuple, {'b': (1, 2, 3)})
>>> d['a'] = d['a'] + (3,)
>>> d
{'b': (1, 2, 3), 'a': (3,)}
同時,它看起來像你試圖使用通常存儲爲每個鍵單個值的結構,但能神奇地轉換成多個值,在第一時間就需要擴大它。在一般情況下,這是不明確的 - 沒有辦法區分碰巧是元組或列表的單個值與多個值。你可以在一個特定的情況下做到這一點,你知道你的值永遠不會是集合(但要記住,字符串是字符串的集合;這會在某個時候咬你),或者可能是集合,但永遠不會成爲特定類型的集合你正在使用,或者其他什麼。但因爲這是通常不是一個好主意,Python並不容易。所以,你必須做這樣的事情:
def add_to_multidict(multidict, key, value):
if key in multidict:
if isinstance(multidict[key], tuple):
multidict[key] = multidict[key] + (value,)
else:
multidict[key] = (multidict[key], value)
else:
multidict[key] = value
如果你希望能夠調用此爲對字典的方法,你將需要繼承dict
和寫入的方法來做到這一點。如果您希望能夠將其稱爲該值的方法,則還需要tuple
的子類,並使您的dict子類使用元組子類。
最後,它看起來像你想這樣做不僅與multidict本身,還與該multidict店 - 換句話說,你希望每個鍵映射到一組對象的單個值它們本身是單個對象或對象的元組。您需要編寫代碼以將該邏輯向下推進一步;這並不難。
如果你想推下來的步驟的無限數,所以你可以做d['a'][1][2][1].append(3)
,那麼你會想這樣做遞歸:元組的子類只具有擴大的值時,創建自己的實例,而不是創建一個元組。
a[1] = [[1], [2], [3]]
a[1][1].append(5) # -> [[1], [2, 5], [3]]
目前還不清楚你實際上試圖用這種方法實際做什麼;可能有更好的方法來實現它。
在Python中,元組是不可變的,所以你試圖做的事情是行不通的。
不知道你實際想要做什麼,很難告訴你。兩個一般的技巧:從你想要的引用*這個結構的代碼開始,看看是什麼樣的,並且向後工作來構建數據結構,並且儘量不要在單個層次上混合列表和標量 - 考慮一個元素的列表代替。 –
那麼,我有一個字典,我試圖給同一個鍵添加更多的值。這是可能的嗎? – Scooby
你想通過這樣做來達到什麼目的?看起來您已經決定解決其他問題的錯誤方法,現在正在詢問如何使該解決方案有效。如果您告訴我們您真的想要做什麼,我們可能會提供更好的答案。 – user2357112