什么是反转defaultdict(列表)的pythonic方法?

时间:2014-01-18 06:36:46

标签: python list collections reverse defaultdict

反转defaultdict(list)的pythonic方法是什么?

我可以遍历defaultdict并创建一个新的defaultdict。 还有其他方法吗?这是pythonic:

>>> from collections import defaultdict
>>> x = defaultdict(list)
>>> y = [[1,2,3,4],[3,4,5,6]]
>>> z= ['a','b']
>>> for i,j in zip(y,z):
...     x[j] = i
... 
>>> x
defaultdict(<type 'list'>, {'a': [1, 2, 3, 4], 'b': [3, 4, 5, 6]})
>>> x2 = defaultdict(list)
>>> for k,v in x.items():
...     for i in v:
...             x2[i].append(k)
... 
>>> x2
defaultdict(<type 'list'>, {1: ['a'], 2: ['a'], 3: ['a','b'], 4: ['a','b'], 5: ['b'], 6: ['b']})

2 个答案:

答案 0 :(得分:2)

我相信最好的方式就是像你一样循环:

target = defaultdict(list)
for key, values in original.items():
    for value in values:
        target[value].append(key)

或者你可以避免使用内部for

for key, values in original.items():
    target.update(zip(values, [key] * len(values)))

或使用itertools.repeat

import itertools as it

for key, values in original.items():
    target.update(zip(values, it.repeat(key)))

然而,这些最后的解决方案仅适用于不同列表中的值不同的简单情况。


请记住,pythonic没有任何明确的含义。 '认为python是一个解决方案:

  1. 可读
  2. 正确使用语言功能
  3. 正确使用内置插件/标准库
  4. 高效
  5. 这些要点按重要性排序。效率是最后的,因为它通常由第2点和第3点暗示。

答案 1 :(得分:1)

这更像是pythonic还是更隐秘?

map(lambda (i, k): x2[i].append(k), [(i, k) for i in v for k, v in x.items()])

python 3需要以下变量,并且不太清楚:

map(lambda i_k: x2[i_k[0]].append(i_k[1]), [(i, k) for i in v for k, v in x.items()])

写这篇文章,我已经得出结论,这可能是关于做到这一点的最少的pythonic方式。但可能是教育;这是给我的。

修改:不要这样做。