繁体   English   中英

python 从值列表中获取字典键

[英]python get dictionary key from value is list

我有两本字典:

first_dict = {'a': ['1', '2', '3'],
              'b': ['4', '5'],
              'c': ['6'],
              }
second_dict = {'1': 'wqeewe',
               '2': 'efsafa',
               '4': 'fsasaf',
               '6': 'kgoeew',
               '7': 'fkowew'
               }

我想要第三个字典,它将包含 second_dict 的键及其来自 first_dict 键的相应值。 这样,我将拥有:

third_dict = {'1' : 'a',
              '2' : 'a',
              '4' : 'b',
              '6' : 'c',
              '7' : None,

}

这是我的方式:

def key_return(name):
  for key, value in first_dict.items():
    if name == value:
      return key
    if isinstance(value, list) and name in value:
      return key
  return None

参考: Python 从值返回键,但它是字典中的列表

但是,我想知道另一种使用 dict.get() 或其他方法的方法。 任何帮助,将不胜感激。 谢谢。

你可以这样做:

代码

first_dict = {'a': ['1', '2', '3'],
              'b': ['4', '5'],
              'c': ['6'],
              }

second_dict = {'1': 'wqeewe',
               '2': 'efsafa',
               '4': 'fsasaf',
               '6': 'kgoeew',
               '7': 'fkowew'
               }

third_dict = dict()

for second_key in second_dict.keys():
    found = False
    for first_key, value in first_dict.items():
        if second_key in value:
            third_dict.setdefault(second_key, first_key )
            found = True
    if not found:
        third_dict.setdefault(second_key, None)
                    
print(third_dict)

Output:

{'1': 'a', '2': 'a', '4': 'b', '6': 'c', '7': None}

希望这可以帮助

带有a_dict.get()的版本

third_dict = {i: {i:k for k,v in first_dict.items() for i in v}.get(i) for i in second_dict.keys()}

这部分{i:k for k,v in first_dict.items() for i in v}
创建一个像{'1': 'a', '2': 'a', '3': 'a', '4': 'b', '5': 'b', '6': 'c'}

您可以 map 第一个字典中的值到它们的键:

values_map = dict([a for k, v in first_dict.items() for a in zip(v, k*len(v))])

然后使用这个 map 创建第三个字典:

third_dict = {key: values_map.get(key) for key, value in second_dict.items()}

由于我知道 first_dict 可能包含单个值而不是列表,因此您可能希望首先将这些值转换为列表:

first_dict = dict(map(lambda x: (x[0], x[1]) if isinstance(x[1], list) else (x[0], [str(x[1])]), first_dict.items()))
res = {
    x: k
    for k, xs in first_dict.items()
    for x in xs
    if x in second_dict
}

这会创建1:a, 2:a, 4:b等。如果您还想缺少像7:None这样的键,请使用虚拟字典加入它:

res = {k: None for k in second_dict} | {
    x: k
    for k, xs in first_dict.items()
    for x in xs
    if x in second_dict
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM