Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python将1个字典的值与另一个字典的键匹配_Python_Loops_Dictionary - Fatal编程技术网

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

使用Python将1个字典的值与另一个字典的键匹配,python,loops,dictionary,Python,Loops,Dictionary,我有两本字典。是否可以用DictB的值循环DictA的键,如果DictB的值匹配,它将返回DictB的键。 ​ 有可能吗 请给我一些建议/提示。我做错了什么?非常感谢。 示例: A: {'WNT3A': '1732', 'RG59L': ' ', 'SCZD9': ' ', 'CD241': '6005', 'C2': '', 'RH': ' '} B: {'': [''], '6005': ['RH50A', ' CD241', ' SLC42A1'], '603': [''], '600

我有两本字典。是否可以用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': ''}  
{'WNT3A': [None], 'RG59L': [['']], 'SCZD9': [['']], 'CD241': [['RH50A', ' CD241', ' SLC42A1']], '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': '1732', 'RG59L': '', 'SCZD9': '', 'CD241': '6005', 'C2': '', 'RH': ''}  
{'WNT3A': [None], 'RG59L': [['']], 'SCZD9': [['']], 'CD241': [['RH50A', ' CD241', ' SLC42A1']], 'C2': [['']], 'RH': [['']]}

您可以将听写理解用于:

>>> {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(,v)
,如果生成器表达式返回一个空迭代器(即如果B的值中没有一个包含键
k
),那么只需使用
A
中的值
v
,否则使用生成器表达式返回的键

上述代码也可以写成:

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

这将使用所需的值更新字典
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
并更新它。

您是想更改字典a的值,还是想返回一个全新的独立字典?是的,这就成功了。非常感谢你。如果你不介意的话,你能给我解释一下代码吗……因为目前,我不知道代码是如何工作的