Python字典:根据其他值中的键出现替换值

时间:2017-11-07 16:19:02

标签: python dictionary

如果我没弄错的话,我的问题可能包括理解 所以我有一本字典:

data = {
 1: [2, 4], 
 2: [3], 
 3: [1, 2, 6], 
 4: [1, 3, 6], 
 6: [3, 4]
}  

我希望重新排列字典值(而不是键),以便在任何其他值中每次出现“键”时,当前键的值现在应该包含最初发生的值的“键”。登记/> 例如,字典现在应该如下所示:

new_data = {
 1: [3, 4], 
 2: [1, 3], 
 3: [2, 4, 6], 
 4: [1, 6], 
 6: [3, 4]
}  

我确定我必须使用另一个空字典来解决这个问题,我必须使用循环。我有一个起点,但效率不高:

for pk,pv in zip(data.keys(), data.values()):
    #print(pk,pv)
    for pvs in pv:
        #print(pvs)
        if pk == pvs:
            new_data.setdefault(pk, [])
            new_data[pk].append(pvs)

print(new_data)  

感谢任何帮助。在此先感谢:)
(使用Ubuntu 14.04 32位VM和Python 2.7)

2 个答案:

答案 0 :(得分:5)

也许这不是最有效的方法,但我认为这是最好的阅读之一:)。

我之前应该说的一件事是,如果可以将初始字典值更改为set而不是list,那么可能会导致一些性能提升,因为set成员资格检查可以快于lists s。

这里是:

def present_in(k, d):
    return {idx for idx in d if k in d[idx]}

new_data = {k: present_in(k, data) for k in data}

基本上present_in函数会创建一组与k作为成员存在的键对应的值。然后我们使用它来使用字典理解来创建new_data字典。请再次注意,此字典的值是一个集合,而不是列表。如果确实需要列表,可以轻松地将它们包装在list()中。

编辑:

如果您希望new_data拥有可能作为data中的键丢失但仍作为其中一个值的键,则可以更改代码以首先创建一组所有可能的键:

all_keys = {v for vs in data.values() for v in vs}

def present_in(k, d):
    return {idx for idx in d if k in d[idx]}

new_data = {k: present_in(k, data) for k in all_keys}

答案 1 :(得分:1)

{k:[i for i,j in data.items() if k in j] for k,_ in data.items()}
#Output:
#{1: [3, 4], 2: [1, 3], 3: [2, 4, 6], 4: [1, 6], 6: [3, 4]}

下面的部分基本上检查dict中的任何值中是否存在密钥(来自外部字典的k),如果存在,它将获得相应的密钥到列表中

[i for i,j in data.items() if k in j]
相关问题