-1

什么是 pythonic 的方式来反转 a defaultdict(list)

我可以遍历 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']})
4

2 回答 2

3

我相信最好的方法是像你一样简单地循环:

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. 高效的

并且这些点是按重要性排列的。效率是最后的,因为它通常由第 2 点和第 3 点暗示。

于 2014-01-18T08:56:52.810 回答
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()])

写到这里,我得出的结论是,这可能是最不符合 Python 的做法。但可能具有教育意义;这是给我的。

编辑:不要这样做。

于 2014-01-18T06:58:53.027 回答