使用Python将1个字典的值与另一个字典的键匹配

时间:2014-12-01 03:51:50

标签: python loops dictionary

我有2个词典。是否可以使用DictB的值循环DictA的键,如果DictB的值匹配,它将返回DictB的键。

有可能吗?
请给我一些建议/提示。我究竟做错了什么?谢谢。
示例:

A: {'WNT3A': '1732', 'RG59L': ' ', 'SCZD9': ' ', 'CD241': '6005', 'C2': '', 'RH': ' '}

B: {'': [''], '6005': ['RH50A', ' CD241', ' SLC42A1'], '603': [''], '6000': [''], '8787': ['PERRS', ' RGS9L', ' MGC26458'], '41': ['ACCN2', ' BNaC2', ' hBNaC2'], '8490': [''], '9628': [''], '5999': ['SCZD9']}

结果:

new_A: {'WNT3A': '1732', 'RG59L': ' ', 'SCZD9': '5999 ', 'CD241': '6005', 'C2': '', 'RH': ' '}​

到目前为止,我已对此进行了编码,但它似乎只返回一个完整的字典或仅包含字典B的字典。

new_a = {}
for key in ref_dict:
for value in (map(lambda x: x.strip(), ref_dict[key][0])):
    if(not fill_dict.has_key(key)):
        continue
    elif(ref_dict[value] != fill_dict[key]):
        new_a[value] = (ref_dict[key], fill_dict[key])
print new_a

结果:

{'WNT3A': '1732', 'RG59L': '', 'SCZD9': '', 'CD241': '6005', 'C2': '', 'RH': ''}  

我尝试过的另一个代码是:

new_dict = {}
for k, v in fill_dict.iteritems():
    vals = []
    if isinstance(v, list):
       for i in v:
            vals.append(ref_dict.get(i))
    else:
    vals.append(ref_dict.get(v))
    if not vals:
        continue
    new_dict[k] = vals
print new_dict

结果:

{'WNT3A': [None], 'RG59L': [['']], 'SCZD9': [['']], 'CD241': [['RH50A', ' CD241', ' SLC42A1']], 'C2': [['']], 'RH': [['']]}

2 个答案:

答案 0 :(得分:0)

您可以对next()使用dict-comprehension:

>>> {k: next((k1 for k1, v1 in B.items() if k in v1), v)  for k, v in A.items()}
{'WNT3A': '1732', 'RG59L': ' ', 'SCZD9': '5999', 'CD241': '6005', 'C2': '', 'RH': ' '}

这里我使用了next(<gen exp>, v),如果生成器表达式返回一个空迭代器(即如果B的值都没有包含键k),那么只需使用v中的值A d = {} for k, v in A.items(): for k1, v1 in B.items(): if k in v1: d[k] = k1 break else: #this will be executed if no value in `B` contains `k` d[k] = v ,否则使用生成器表达式返回的密钥。

上述代码也可以写成:

{{1}}

答案 1 :(得分:0)

这将使用您想要的值更新字典a

for key_a in a:
    for key_b, value_b in b.iteritems():
        for item in value_b:
            if item == key_a:
                a[key_a] = key_b

如果您需要一个全新的dict,那么只需制作a的副本并更新该副本。

相关问题