2

假设我有一个字典:

x =  { "a": ["walk", "the", "dog"], "b": ["dog", "spot"], "c":["the", "spot"]  }

并想要新的字典:

y = { "walk": ["a"], "the": ["a", "c"], "dog":["a", "b"], "spot":["b","c"]  }

最有效的方法是什么?如果一个解决方案只有几行,并且通过 pythonic 构造以某种方式变得简单,那么它是什么(即使它不是最有效的)?

请注意,这与值是单个元素而不是列表的其他问题不同。

4

3 回答 3

5

您可以使用defaultdict

from collections import defaultdict

y = defaultdict(list)

for key, values in x.items():  # .iteritems() in Python 2
    for value in values:
        y[value].append(key)
于 2013-07-26T04:54:23.397 回答
2
y = {}
for (k, v) in x.iteritems():
    for e in v:
        y.setdefault(e, []).append(k)

我将此作为@Blender 答案的替代方案,因为这是我习惯使用的,但我认为Blender 的更好,因为它避免[]了在内循环的每一次传递中构建一个临时的。

于 2013-07-26T04:57:02.833 回答
1

不一定是高效的,但只是为了好玩的一个班轮:

{b: [k for k, w in x.iteritems() if b in w] for v in x.values() for b in v}

这里的想法是遍历原始字典 ( for v in x.values()) 中的所有值,然后遍历列表 ( for b in v) 中的所有项目,然后b用作 dict-comprehension 中的键。for 的值b是一个列表理解[k for ...],其中成员是字典中的键,x其值w包含 word b

因为范围有限,你实际上可以写v而不是w上面的,这使得它更难理解。:-)

(编辑添加,我会使用@Blender's。这些衬里很有趣,但很难理解。)

于 2013-07-26T05:17:31.107 回答