簡體   English   中英

用於在具有多個相等值的字典中交換鍵/值的字典理解

[英]Dictionary comprehension for swapping keys/values in a dict with multiple equal values

def invert_dict(d):
    inv = dict()
    for key in d:
        val = d[key]
        if val not in inv:
            inv[val] = [key]
        else:
            inv[val].append(key)
return inv

這是 Think Python 書中的一個示例,一個用於反轉(交換)字典中的鍵和值的函數。 新值(以前的鍵)被存儲為列表,所以如果有多個字典值(綁定到不同的鍵)在反轉之前相等,那么這個函數只是將它們附加到以前的鍵列表中。

例子:

somedict = {'one': 1, 'two': 2, 'doubletwo': 2, 'three': 3}
invert_dict(somedict) ---> {1: ['one'], 2: ['doubletwo', 'two'], 3: ['three']}

我的問題是,字典理解也可以這樣做嗎? 此函數創建一個空的 dict inv = dict() ,然后在函數中稍后使用if/else檢查是否存在值。 在這種情況下,字典理解應該自我檢查。 這可能嗎,語法應該是什么樣的?

交換值的通用字典理解語法是:

{value:key for key, value in somedict.items()}

但是如果我想添加一個“如果”子句,它應該是什么樣子的? if value not in (what)

謝謝。

我認為在不使用其他函數的情況下進行簡單的字典理解是不可能的。

以下代碼使用itertools.groupby對具有相同值的鍵進行分組。

>>> import itertools
>>> {k: [x[1] for x in grp]
     for k, grp in itertools.groupby(
         sorted((v,k) for k, v in somedict.iteritems()),
         key=lambda x: x[0])
    }
{1: ['one'], 2: ['doubletwo', 'two'], 3: ['three']}

您可以使用集合理解的副作用:

somedict = {'one': 1, 'two': 2, 'doubletwo': 2, 'three': 3}

invert_dict={}
{invert_dict.setdefault(v, []).append(k) for k, v in somedict.items()}

print invert_dict
# {1: ['one'], 2: ['doubletwo', 'two'], 3: ['three']}

這是一個很好的答案:

fts = {1:1,2:1,3:2,4:1}

new_dict = {dest: [k for k, v in fts.items() if v == dest] for dest in set(fts.values())}

參考:Head First Python,第 2 版,第 (502) 頁

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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