从两个现有的dict创建dict

2024-10-01 07:34:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个dicts,它们的值是set。在

Dct1 = {'a':[1, 2, 3], 'b':[4, 5, 6, 7], 'c':[8, 9, 10], 'd':[11, 12, 13, 14]}
Dct2 = {'TypeZ':['a', 'b'], 'TypeX':['c', 'd']}

我想再写一句话: 1迭代Dct1中的值项 2检查项值的键是否为Dct2值中的项 三。使用dct2的键作为新dct的键,dict one中值的对应项作为新dict的设置值

^{pr2}$

我还想避免Dct3的值重复。在

下面是我目前正在努力解决的代码片段(其他dicts已经成功构建):

RateByType = {}

for key, item in RoRaDct.items():
    for i, j in TpRtDct.items():
        for x in item:
            for y in j:
                if key == y:
                    RateByType[i].add(item)

但它产生了一个关键错误。我尝试过使用defaultdict(set),但是得到了一个TypeError:unhable type:set。后者是我用来构建前两个dict的方法。在


Tags: keyinforitemsitemdictsetdicts
2条回答
Dct3 = {k: set.union(*map(lambda x: set(Dct1.get(x, [])), v)) for k, v in Dct2.items()}

对于Dct2中的每个键、值对,我们将该键映射到由Dct1中的键的成员元素映射到的集合的并集。在

编辑:解释

^{pr2}$

是一个dictionary comprehension,它重新创建Dct2。在

set.union(*map(lambda x: set(Dct1.get(x, [])), v))

是我们用来建造这套装置的,但是让我们从里到外看它。在

Dct1.get(x, [])

尝试访问Dct1[x]并返回它。如果dict没有键x,则返回一个空列表[]

set(Dct1.get(x, []))

获取上面Dct1.get的结果并将其转换为一个集合。在

lambda x: set(Dct1.get(x, []))

定义一个匿名函数(即它没有名字)。{{cd5>函数只需要使用

map(lambda x: set(Dct1.get(x, [])), v)

map是一个函数,它接受另一个函数(在本例中是lambda函数)和一个iterable(类似于列表),然后生成一个iterable,将该函数应用于输入iterable的每个元素。在

*map(lambda x: set(Dct1.get(x, [])), v)

此上下文中的*运算符用于解压缩ITerable。所以它接受一个像[1, 2, 3]这样的iterable并将add(*[1, 2, 3])转换成{}

 set.union(*map(lambda x: set(Dct1.get(x, [])), v))

set.union是一个函数,它接受多个集合并计算它们的并集,基本上将它们全部相加。在

Dct2的键创建一个集合,然后为Dct3创建一个defaultdict,循环Dct2的键及其相应的值:

import collections
Dct1 = {'a':[1,2,3],'b':[4,5,6,7],'c':[8,9,10],'d':[12,12,13,14]}
Dct2 = {'TypeZ':['a','b'],'TypeX':['c','d']}
s = set(Dct2)
d = collections.defaultdict(list)
for key in Dct2:
    for k in Dct2[key]:
        d[key].extend(Dct1[k])

结果:

^{pr2}$

相关问题 更多 >