是否有任何简单的方法可以在值为列表的位置交换python字典键值

是否有任何简单的方法可以在值为列表的位置交换python字典键值,python,dictionary,Python,Dictionary,是否有任何简单的方法可以在值为列表的位置交换python字典键值 我的字典如下 d={1:[1,2,3,4],2:[2,3,4],5:[1,3,6,7]} 我想从中生成一个字典,如下所示 a={1:[1,5],2:[1,2],3:[1,2,5],4:[1,2],6:[5],7:[5]} 我用反方向测试 dict(map(reversed, d.items()) 它不会使用列表中的项目迭代和创建键返回TypeError:Unhabable type:'list' 我正在寻找任何可用的内联方法

是否有任何简单的方法可以在值为列表的位置交换python字典键值 我的字典如下

d={1:[1,2,3,4],2:[2,3,4],5:[1,3,6,7]}
我想从中生成一个字典,如下所示

a={1:[1,5],2:[1,2],3:[1,2,5],4:[1,2],6:[5],7:[5]}
我用反方向测试

dict(map(reversed, d.items())
它不会使用列表中的项目迭代和创建键返回TypeError:Unhabable type:'list'


我正在寻找任何可用的内联方法来实现这一点

您的方法行不通,因为您的目标是构建一个字典:

{[1,2,3,4]: 1, [2,3,4]: 2, [1,3,6,7]: 5}
在此操作之后,
result
是一个
defaultdict
(普通
dict
的子类),它将值列表中的项映射到键(包含该值的键)。比如:

使用这些值创建一个新字典(从而删除
defaultdict

请注意:

  • 由于大多数Python解释器不会对字典排序(这绝对不是一个很难做出的假设),因此列表中元素的顺序可能会有所不同;及
  • 词典
    d
    中列表中的项目应该是可散列的
这将起作用:

def revdict(d):
    r = {}
    for k in d:
        for v in d[k]:
            if v not in r:
                r[v] = [k]
            else:
                r[v].append(k)
    return r
然后你可以做:

d={1:[1,2,3,4],2:[2,3,4],5:[1,3,6,7]}
a = revdict(d)
print(a)

如果您不想检查新的密钥,可以使用
defaultdict
,然后始终追加。

这并不真正适用于单行程序;你把你需要做的事情简单化了,称之为简单的逆转

真正的反转只是将值映射到键,而不是将键映射到值,您可以这样做(稍微但必要地将列表更改为元组):

你们想要的要复杂得多,通常被称为口述的转置

from operator import itemgetter as ig
from itertools import groupby

transposed_dict = dict((k, map(ig(1), v)) 
                       for k, v in groupby(
                                      sorted((nk, k) for k in d for nk in d[k]),
                                             key=ig(0)))
这没有什么特别简单的,尽管从概念上来说还不算太糟糕:

  • (nk,k)for k in d for nk in d[k]
    从字典中创建一个扩展的关联列表,其中键和值被反转

  • groupby
    收集具有公共第一个元素的所有元组

  • (k,map(ig(1),v))
    将具有公共第一个元素的元组收集到单个元组中:
    (1,1)、(1,2)=>(1[1,2])

  • 步骤3中的元组用于构建新字典


  • 然而,使用Willem Van Onsem所示的简单的3行
    for
    循环,您的情况要好得多;循环的本质是
    排序的
    使用的生成器表达式;其他一切都只是为了避免可变变量。并非所有内容都应该(或可以)简化为一行。

    听起来你想要一个有向图。你在乎列表元素的顺序吗?不在乎顺序
    def revdict(d):
        r = {}
        for k in d:
            for v in d[k]:
                if v not in r:
                    r[v] = [k]
                else:
                    r[v].append(k)
        return r
    
    d={1:[1,2,3,4],2:[2,3,4],5:[1,3,6,7]}
    a = revdict(d)
    print(a)
    
    >>> print dict((tuple(d[k]), k) for k in d)
    {(1, 3, 6, 7): 5, (2, 3, 4): 2, (1, 2, 3, 4): 1}
    
    from operator import itemgetter as ig
    from itertools import groupby
    
    transposed_dict = dict((k, map(ig(1), v)) 
                           for k, v in groupby(
                                          sorted((nk, k) for k in d for nk in d[k]),
                                                 key=ig(0)))