Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是pythonic方法来反转defaultdict(列表)?_Python_List_Collections_Reverse_Defaultdict - Fatal编程技术网

什么是pythonic方法来反转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

什么是pythonic方法来反转defaultdictlist

我可以遍历defaultdict并创建一个新的defaultdict。 还有别的办法吗?这是蟒蛇式的吗

>>> 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)))