是否有任何简单的方法可以在值为列表的位置交换python字典键值
是否有任何简单的方法可以在值为列表的位置交换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' 我正在寻找任何可用的内联方法
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])
然而,使用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)))