Python逆dict非均匀映射

2024-09-27 07:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本这样的字典:

dict1 = {'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]}

想要这样的反例:

^{pr2}$

比如这些问题:

Inverse Dict in Python\\ In-place dictionary inversion in Python

但我想用非唯一键来做,我不想就地转换。我有一些代码在工作,但我想知道是否有一种字典理解的方法来实现这一点。在

from collections import defaultdict
dict2 = defaultdict(list)
for i in dict1:
    for j in dict1[i]:
        dict2[j].append(i)

我试过了,但它只适用于唯一的映射。我的意思是“对于每个值,只有一个键列出值”。因此唯一映射:“1:[a],2:[b],3:[c]->;a:[1],b:[2],c:[3]“VS非唯一映射”1:[a],2:[a,b],3:[b,c]->;a:[1,2],b:[2,3],c:[3]”

dict2 = {j: i for i in dict1 for j in dict1[i]}

我想一定是这样的:

dict2 = {j: [i for i in dict1 if j in dict1[i]] for j in dict1[i]} # I know this doesn't work

除此之外,这样的理解似乎效率低下。有没有一种有效的、单一的方法来做到这一点?在


Tags: 方法ingtfordictionary字典placedict
3条回答

标准dict

>>> dict2 = {}
>>> for key, values in dict1.items():
...     for value in values:
...             dict2.setdefault(value, []).append(key)
... 
>>> dict2
{1: ['a', 'c', 'b'], 2: ['a', 'c', 'b'], 3: ['a', 'b'], 4: ['b']}

^{}

^{pr2}$

作为一个单行线(感谢mhlesters的输入),但可读性如此之高(而且只因为dict2中的值是可变的,因此setdefault返回对它们的引用):

import itertools
[dict2.setdefault(k,[]).append(v) for k,v in itertools.chain.from_iterable([itertools.product(vals,[key]) for key,vals in dict1.items()])]

或者使用for循环:

^{pr2}$

我根据Vroomfondel的回答得出了一个答案:

dict1 = {'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]}
dict2 = {item: [key for key in dict1 if item in dict1[key]] for value in dict1.values() for item in value}

这不是最快的,但它是一个单一的班轮,它不是最慢的选择提出!在

^{pr2}$

打印输出:

   Vroomfondel1     0.202519893646
   Vroomfondel2     0.164724111557
***Vroomfondel2 mod     0.114083051682
      mhlester1     0.0599339008331
  mhlester1 mod     0.091933965683
      mhlester2     0.0900268554688
        initial     0.0953099727631

相关问题 更多 >

    热门问题