[英]In-place Python dictionary inverse
我想看看是否有可能解決的任務是,通過就地計算交換字典的鍵,值對(在Python中), 而無需額外的數據結構 (僅恆定數量的額外變量)。 在有限的世界中,這似乎不太可能,但是我很樂意聽到有關解決它的建議。
我已經看到了一些有關python中就地字典逆的文章,並且我發現所有解決方案之間都有一個共同之處。 以下字典將無法正確逆轉:
dict = {'b':'a','a':'c','c':123}
這樣做的原因是,交換第一個參數時,我們會覆蓋'a'的實際值(值是唯一的,鍵是唯一的,但這並不意味着不存在與a相同的值已經存在的密鑰)
筆記:
1)作為示例給出的字典具有可哈希值。
2)鍵/值可以是任何數據類型。 不一定是字符串。
我很想聽聽解決它的方法,我想過一種方法,但是它只有在我們擁有無限內存的情況下才有效,這顯然是不正確的。
編輯:
1)我的想法是,更改字典,以便在每個鍵條目的開頭添加恆定數量的下划線(_)。 下划線的數量取決於按鍵,如果某個按鍵具有X下划線,我將添加X + 1下划線(max_underscores_of_key_in_prefix + 1)。 為了解決鍵中的對象,我將為此創建一個包裝器類。 我已經盡力解釋了我的直覺,但是我不確定這是否可行。
2)@Mark Ransom的解決方案可以完美地工作,但是如果有人對問題有其他算法解決方案,我仍然很樂意聽到! 我將此問題標記為已解決,因為它已解決,但是同樣,其他解決方案也非常受歡迎:-)
顯然,要做到這一點,鍵和值都必須是可哈希的。 這意味着您的任何鍵或值都不能是list
。 我們可以利用它來知道哪些字典元素已經被處理。
由於您不能同時迭代和修改字典,因此每次交換鍵/值時都必須重新開始。 這使它非常緩慢,需要執行O(n ^ 2)操作。
def invert_dict(d):
done = False
while not done:
done = True
for key, val in d.items():
if isinstance(val, list):
if len(val) > 1:
d[key] = [val[1]]
val = val[0]
else:
del d[key]
if not isinstance(val, list):
if val in d:
d[val] = [d[val], key]
else:
d[val] = [key]
done = False
break
for key, val in d.items():
d[key] = val[0]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.