从 2 个现有字典(1 个嵌套字典,1 个列表字典)创建一个新字典

时间:2021-02-05 17:49:10

标签: python python-3.x

我有两个字典 K 和 L。K 是列表字典L 是嵌套字典

 K={
    'k1':[1,3,2],
    'k2':[3,4,5],
    'k3':[9,10,11]
    }

L = {
'l1':{'a':'1','b':'1','c':'2'},
'l2':{'a':'1','b':'3','c':'2'},
'l3':{'a':'1','b':'2','c':'2'},
'l4':{'a':'1','b':'4','c':'2'}
}

我需要什么: 我想根据以下条件创建一个新的列表字典

  1. 我需要检查列表的 K 字典中是否存在 L 的 b 值
  2. 如果存在,我需要返回一个带有 K 键的新字典 L 字典的字典和键。

对于上面的例子,我需要返回这样的东西

M = {'k1':[l1,l3,l2]
     'k2':[l2,l4]
     }

这是我尝试过的代码:

M= {}
for k, v in K.items():
  temp = []
  for i in v:
    if L[i]['b'] in K[k]:
      temp.append(i)
      M[k] = temp
    
print(M)

3 个答案:

答案 0 :(得分:1)

这是您的解决方案:

new_dict, M = dict(), dict()

for key, val in L.items():
    new_dict[val['b']] = key

for key, val in K.items():
    for x in val:

        if str(x) in new_dict:
            tmp = new_dict[str(x)]
            lst = M[key] if key in M else list()
            lst.append(tmp)
            M[key] = lst
print(M)

对于以下 K、L:

K = {
'k1':[1,3,2],
'k2':[3,4,5],
'k3':[9,10,11]
}

L = {
'l1':{'a':'1','b':'1','c':'2'},
'l2':{'a':'1','b':'3','c':'2'},
'l3':{'a':'1','b':'2','c':'2'},
'l4':{'a':'1','b':'4','c':'2'}
}

输出 M:

M = {
'k2': ['l2', 'l4'], 
'k1': ['l1', 'l2', 'l3']
}

[ 考虑到 L 的 b 值 具有唯一 值,如果没有,则必须将其作为列表存储在 new_dict 字典中。]< /p>

答案 1 :(得分:0)

您在 L 中查找错误的内容 L[I]。我会通过从 L 开始创建一个查找来做到这一点,这样你就不必为 K 中的每个键遍历 L。从那里您可以通过 K 一次,从查找中查找项目。

使用 defaultdict 还允许您处理 L 具有相同 b 值的情况

from collections import defaultdict

b_val_to_l = defaultdict(set)
for lkey, ldict in L.items():
    # For each ldict, extract the 'b' value, convert to an int and add the
    # l key to the set of l values for the corresponding b value
    b_val_to_l[int(ldict['b'])].add(lkey)

print(b_val_to_l)

M = defaultdict(list)
for k, v in K.items():
  for i in v:
      # For each value in the k, get the set of corresponding l values
      b_set = b_val_to_l.get(i, set())

      # Add to the output dict
      M[k].extend(list(b_set))

print(M)

答案 2 :(得分:0)

就这样做:

Mtemp = { k: [l for l in L
            if int(L[l]['b']) in K[k]
        ] for k in K }

# Mtemp can have None values, so let's remove them...
M = { k: l for k, l in Mtemp.items() if len(l) > 0 }

输出:

{'k1': ['l1', 'l2', 'l3'], 'k2': ['l2', 'l4']}
相关问题