簡體   English   中英

就地Python字典逆

[英]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.

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