什么是pythonic方法来反转defaultdict(列表)?
什么是pythonic方法来反转defaultdictlist 我可以遍历defaultdict并创建一个新的defaultdict。 还有别的办法吗?这是蟒蛇式的吗什么是pythonic方法来反转defaultdict(列表)?,python,list,collections,reverse,defaultdict,Python,List,Collections,Reverse,Defaultdict,什么是pythonic方法来反转defaultdictlist 我可以遍历defaultdict并创建一个新的defaultdict。 还有别的办法吗?这是蟒蛇式的吗 >>> from collections import defaultdict >>> x = defaultdict(list) >>> y = [[1,2,3,4],[3,4,5,6]] >>> z= ['a','b'] >>> for
>>> 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']})
这是更像蟒蛇还是更神秘
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的方式。但可能是教育性的;是给我的
编辑:不要这样做。我认为最好的方法就是像你那样简单地循环:
target = defaultdict(list)
for key, values in original.items():
for value in values:
target[value].append(key)
或者,您也可以避免以下情况:
或使用itertools。重复:
然而,这些最后的解决方案只适用于不同列表中的值不同的简单情况
记住,pythonic没有任何明确的含义。我认为Python的一个解决方案是:
可读的
正确使用语言功能
正确使用内置/标准库
有效率的
这些要点是按重要性排序的。效率是最后一个,因为第2点和第3点通常暗示了这一点。不清楚为什么这里需要一个defaultdict。原始的defaultdict有一个唯一标识符,用于不同名称的相同事物。但要使用其中一个名称查找标识符,每次都必须执行一个值来进行键搜索,因此使用反向defaultdict优化代码。x的输出不应该是defaultdict,{'a':[1,2,3,4],'b':[3,4,5,6]}?不知道给定输出的7,8部分来自哪里。啊,忘了适当地更改;糟糕的剪切和粘贴能力…在地图中使用一个有副作用的函数绝对不是pythonic,我认为:@thefourtheye。。。我曾希望能够理解带有defaultdict功能的词典。map和lambda是我能想到的最好的,我同意这比OP的原作更糟糕。即使它真的起作用了,请注意,这在python3中完全失败了,甚至是所谓的python3变体。映射永远不会执行任何函数调用,因为它是懒惰的。谢谢@Bakuriu。我没有蟒蛇3要测试。但这是最好的理由还没有这样做,因为大概停止工作在2to3
for key, values in original.items():
target.update(zip(values, [key] * len(values)))
import itertools as it
for key, values in original.items():
target.update(zip(values, it.repeat(key)))