使两个不同字典的公共值的字典键相同

2024-09-29 05:16:21 发布

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

我有两个字典dic1和dic2有共同的值,但不同的键。 例如:

dic1 = {'M_001': 'gly-glu-L', 'M_002': 'Ala-Gln'}
dic2 = {'M_003': 'gly-glu-L', 'M_004': 'Ala-Gln'}

我使用了以下代码来检索这两者之间的公共值:

match = []
for value1 in dic1.values():
    for value2 in dic2.values():
        if value1 == value2:
            match.append(value1)

接下来,对于两个字典中的每个公共值,我希望有相同的键。你知道吗

第一个目标:

dic1 = {'M_003': 'gly-glu-L', 'M_004': 'Ala-Gln'}

dic2 = {'M_003': 'gly-glu-L', 'M_004': 'Ala-Gln'}

具有唯一标识符的第二个目标:

dic1 = {'MX_001': 'gly-glu-L', 'MX_002': 'Ala-Gln'}

dic2 = {'MX_001': 'gly-glu-L', 'MX_002': 'Ala-Gln'}

我需要一些关于如何进行的情报,因为我还停留在这个阶段。你知道吗

谢谢你!你知道吗


Tags: in目标for字典matchvaluesmxvalue1
2条回答

如果不想创建其他反向副本,可以制作一个单独的列表和字典来执行以下任务:

def comun(dict1, dict2):
        # get common information
        emptyDict = {}
        removeList = []
        for d1key, d1val in dict1.items():
            for d2key, d2val in dict2.items():
                if (d1val == d2val):
                    removeList.append(d1key)
                    emptyDict[d2key] = d2val
                    break

        # remove repeated elements
        for item in removeList:
            del dict1[item]

        # add common elements
        dict1.update(emptyDict)

dict1 = {'M_001': 'gly-glu-L', 'M_002': 'Ala-Gln'}
dict2 = {'M_003': 'gly-glu-L', 'M_004': 'Ala-Gln'}
if __name__ == '__main__':
    print(dict1)
    print(dict2)
    comun(dict1,dict2)
    print(dict1)
    print(dict2)
def tmp(d1, d2):
    # create 2 new dicts where the key and values are reversed
    rd1 = dict((v,k) for k,v in d1.items())  
    rd2 = dict((v,k) for k,v in d2.items())
    for v in set(rd1.keys()) & set(rd2.keys()):
        # cycle over the common values
        del d1[rd1[v]] # delete the old_key from the first dict
        d1[rd2[v]] = v # set the value with the same key as the second one

def tmp2(d1, d2):
    # solution for a "multiple key, same value in first dict" situation 
    rd1 = {}
    for k,v in d1.items():
        if v not in rd1: # could use a defaultdict to avoid this
            rd1[v] = []
        rd1[v].append(k)
    rd2 = dict((v,k) for k,v in d2.items())
    for v in set(rd1.keys()) & set(rd2.keys()):
        for k in rd1[v]: # delete all the (old) keys
            del d1[k]
        d1[rd2[v]] = v

from random import randrange
def tmp3(d1, d2):
    rd1 = {}
    for k,v in d1.iteritems():
        if v not in rd1: 
            rd1[v] = []
        rd1[v].append(k)
    rd2 = dict((v,k) for k,v in d2.iteritems())
    for v in set(rd1.keys()) & set(rd2.keys()):
        for k in rd1[v]:
            del d1[k]
        while 1:
            # attention here: if you'd have more than 100 new keys you'll end up with an infinite loop, adjust for your case
            # I've used 100 to maintain the 3 digit format   
            new_key = "MX_%03d" % randrange(100)

            if new_key not in d1: break
        d1[new_key] = v

def tmp4(d1, d2):
    # solution for your final form of the second objective
    # please stop changing the question :D
    rd1 = {}
    for k,v in d1.iteritems():
        if v not in rd1: 
            rd1[v] = []
        rd1[v].append(k)
    rd2 = {}
    for k,v in d2.iteritems():
        if v not in rd2: 
            rd2[v] = []
        rd2[v].append(k)
    for i, v in enumerate(set(rd1.keys()) & set(rd2.keys())):
        for k in rd1[v]:
            del d1[k]
        for k in rd2[v]:
            del d2[k]
        new_key = "MX_%03d" % i # nothimg more random than counter, see: https://xkcd.com/221/
        d1[new_key] = v
        d2[new_key] = v


dic1 = {'M_001': 'gly-glu-L', 'M_002': 'Ala-Gln'}
dic2 = {'M_003': 'gly-glu-L', 'M_004': 'Ala-Gln'}
if __name__ == '__main__':
    print dic1
    print dic2
    tmp(dic1,dic2)
    print
    print dic1
    print dic2

给予

{'M_001': 'gly-glu-L', 'M_002': 'Ala-Gln'}
{'M_004': 'Ala-Gln', 'M_003': 'gly-glu-L'}

{'M_004': 'Ala-Gln', 'M_003': 'gly-glu-L'}
{'M_004': 'Ala-Gln', 'M_003': 'gly-glu-L'}

如果有多个具有相同值的键需要不同的方法,则可能会出现问题。你知道吗

相关问题 更多 >