2017-10-08 24 views
-2

我有一個Python字典這樣的替換字符串的最佳方法:的Python:什麼是字典中的關鍵

{('Live', '2017-Jan', '103400000', 'Amount'): 30, 
('Live', '2017-Feb', '103400000', 'Amount'): 31, 
('Live', '2017-Mar', '103400000', 'Amount'): 32, 
('Live', '2017-Jan', '103401000', 'Amount'): 34 
} 

什麼是「Live2」爲更換「活」的字符串的最佳方式字典中的所有鍵?

我想已經下面,但它拋出一個錯誤:

# cellset is the dictionary 
for x in cellset: 
    x.replace('Live','Live1') 

AttributeError: 'tuple' object has no attribute 'replace'

+2

你不能真正「替換」一個鍵,你必須得到一個引用的值,刪除舊的鍵,然後用新密鑰重新插入值。 – jonrsharpe

+0

您可以使用示例詞典顯示您的操作的預期結果嗎? –

+0

此外,考慮到字符串和元組是不可變的。 –

回答

1
d = { 
    ('Live', '2017-Jan', '103400000', 'Amount'): 30, 
    ('Live', '2017-Feb', '103400000', 'Amount'): 31, 
    ('Live', '2017-Mar', '103400000', 'Amount'): 32, 
    ('Live', '2017-Jan', '103401000', 'Amount'): 34 
} 

new_d = {} 

for k, v in d.items(): 
    new_key = tuple('Live1' if el == 'Live' else el for el in k) 
    new_d[new_key] = v 

print(new_d) 

# Output: 
# {('Live1', '2017-Jan', '103400000', 'Amount'): 30, ('Live1', '2017-Feb', '103400000', 'Amount'): 31, ('Live1', '2017-Mar', '103400000', 'Amount'): 32, ('Live1', '2017-Jan', '103401000', 'Amount'): 34} 
0

的Python類型的字典是哈希表,這就是爲什麼所有可變內置類型是unhashable,不能被用作密鑰(或者用於此事的set元素)。雖然您可以創建自己的可變哈希類型,但修改插入的鍵將會破壞查找表。這基本上意味着你唯一的選擇就是爲你想要修改的每一個插入一個新的密鑰,並且(可選地)刪除以前的版本。除非您有預定義的一組密鑰進行修改,否則需要花費O(N)時間(其中N是字典中的密鑰數)和O(1)額外空間(如果您移除舊密鑰)執行此操作。您還可以使用擴展的字典,理解內部要簡練,避免可能產生的副作用,這將創建一個新的字典

In [1]: d = { 
    ...:  ('Live', '2017-Jan', '103400000', 'Amount'): 30, 
    ...:  ('Live', '2017-Feb', '103400000', 'Amount'): 31, 
    ...:  ('Live', '2017-Mar', '103400000', 'Amount'): 32, 
    ...:  ('Live', '2017-Jan', '103401000', 'Amount'): 34 
    ...: } 

In [2]: {(x.replace("Live", "Live1"), *xs): value for (x, *xs), value in d.items()} 
Out[2]: 
{('Live1', '2017-Feb', '103400000', 'Amount'): 31, 
('Live1', '2017-Jan', '103400000', 'Amount'): 30, 
('Live1', '2017-Jan', '103401000', 'Amount'): 34, 
('Live1', '2017-Mar', '103400000', 'Amount'): 32} 

或在這個非常特殊的情況下(即當更換所有的鍵是相同的) :

In [3]: {("Live1", *xs): value for (_, *xs), value in d.items()} 
Out[3]: 
{('Live1', '2017-Feb', '103400000', 'Amount'): 31, 
('Live1', '2017-Jan', '103400000', 'Amount'): 30, 
('Live1', '2017-Jan', '103401000', 'Amount'): 34, 
('Live1', '2017-Mar', '103400000', 'Amount'): 32} 

這將帶您O(N)時間和O(N)空間。

+0

除非我錯過了某些東西,請注意,如果它出現在元組中的第一個位置,則此方法將僅替換「Live」。我不知道這是否是所需的行爲,只是指出它與我的答案有何不同。 – smarx

1

其他人向您展示瞭如何創建一個以'Live'替換爲'Live1'的新字典。如果你想要這些替換髮生在原始字典中,可能的解決方案看起來像這樣

for (head, *rest), v in tuple(d.items()): 
    if head == "Live": 
     d[("Live1", *rest)] = v 
     del d[(head, *rest)]