反转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']})
答案 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是一个解决方案:
这些要点按重要性排序。效率是最后的,因为它通常由第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方式。但可能是教育;这是给我的。
修改:不要这样做。