【问题标题】:create a dictionary combining other dictionaries python创建一个结合其他字典python的字典
【发布时间】:2018-04-30 20:53:43
【问题描述】:

我有两个类型的字典:

dict1 = {NTID: (ID, CN)}

dict2 = {NTID: INCHI}

我想得到:

dict3 = {NTID: (ID, CN, INCHI)}

我试过用zip,如下:

dict_3 = dict(zip(dict1, dict2))

但我得到 NTID 作为键和值。请注意,每个字典都有多个值,但dict1和dict2之间的值顺序是一致的

编辑:

dict1 中的一个例子是(键:'1-4-HYDROXYPHENYL', '4-AMINO-BUTYRATE', 'ACETYLCHOLINE', 'ASN')

{'1-4-HYDROXYPHENYL': [],
 '4-AMINO-BUTYRATE': [('24', 'gamma-aminobutyrate (GABA)'),
  ('172', 'alpha-ketoglutarate'),
  ('173', 'succinate'),
  ('399', 'Succinate semialdehyde'),
  ('111', 'putrescine'),
  ('114', '4-guanidinobutanoate'),
  ('115', '4-acetamidobutanoate')],
 'ACETYLCHOLINE': [],
 'ASN': [('1', 'glycine'),
  ('45', 'tyrosine'),
  ('74', 'leucine'),
  ('90', 'methionine'),
  ('80', 'valine')]}

dict2:

{'1-4-HYDROXYPHENYL': [],
 '4-AMINO-BUTYRATE': ['InChI=1S/C4H9NO2/c5-3-1-2-4(6)7/h1-3,5H2,(H,6,7)',
  'InChI=1S/C5H6O5/c6-3(5(9)10)1-2-4(7)8/h1-2H2,(H,7,8)(H,9,10)/p-2',
  'InChI=1S/C4H6O4/c5-3(6)1-2-4(7)8/h1-2H2,(H,5,6)(H,7,8)/p-2',
  'InChI=1S/C4H6O3/c5-3-1-2-4(6)7/h3H,1-2H2,(H,6,7)/p-1',
  'InChI=1S/C4H12N2/c5-3-1-2-4-6/h1-6H2/p+2',
  'InChI=1S/C5H11N3O2/c6-5(7)8-3-1-2-4(9)10/h1-3H2,(H,9,10)(H4,6,7,8)',
  'InChI=1S/C6H11NO3/c1-5(8)7-4-2-3-6(9)10/h2-4H2,1H3,(H,7,8)(H,9,10)/p-1'],
 'ACETYLCHOLINE': [],
 'ASN': ['InChI=1S/C9H11NO3',
  'InChI=1S/C9H11NO2/c10-8',
  'InChI=1S/C3H7NO2/c1-2(4)3(5)6',
  'InChI=1S/C5H9NO2/c7-5(8)4-2-1-3',
  'InChI=1S/C4H9NO3/c1-2(6)3',
  'InChI=1S/C4H8N2O3/c5-2(4(8)',
  'InChI=1S/C6H13NO2/c1-3-4(2)',
  'InChI=1S/C6H9N3O2/c7-5(6(10)',
  'InChI=1S/C4H7NO4/c5-2(4(8)9)',
  'InChI=1S/C4H4O5/c5-2(4(8)9)1-',
  'InChI=1S/C3H7NO2S/c4-2(1-7)3(5)',
  'InChI=1S/C5H10N2O3/c6-3(5(9)'}

dict3(输出)应该是这样的:

{'1-4-HYDROXYPHENYL': [],
 '4-AMINO-BUTYRATE': [('24', 'gamma-aminobutyrate (GABA)', 'InChI=1S/C4H9NO2/c5-3-1-2-4(6)7/h1-3,5H2,(H,6,7)'),
  ('172', 'alpha-ketoglutarate', 'InChI=1S/C5H6O5/c6-3(5(9)10)1-2-4(7)8/h1-2H2,(H,7,8)(H,9,10)/p-2', 'InChI=1S/C4H6O4/c5-3(6)1-2-4(7)8/h1-2H2,(H,5,6)(H,7,8)/p-2'),
  ('173', 'succinate', 'InChI=1S/C4H6O3/c5-3-1-2-4(6)7/h3H,1-2H2,(H,6,7)/p-1'),
  etc...

【问题讨论】:

  • dict1['NTID'] += (dict2['NTID'],)?
  • 我应该把它放在一个for循环中,循环遍历每个键吗?
  • 我看过那个帖子,但我的帖子不是真的一样,因为我的一个字典的值是一个元组,我希望我的输出字典有三个元素的元组作为值
  • One of the answers 应该让您了解如何处理此问题。我不确定是否有更好的方法,但缺乏更好的答案似乎表明遍历这两个字典是最好的方法。参考链接的答案,对于您的具体情况,因为dict1 存储元组,而不是.append(value),当值是元组时,您可以使用.extend(value)

标签: python dictionary zip


【解决方案1】:

你可以试试这个代码:

dict1 = {'NTID': ('ID', 'CN')}

dict2 = {'NTID': 'INCHI'}


    final_dict={}
    for key,value in dict1.items():
        final_dict[key]=[value[0],value[1]]
        if key in dict2:
            final_dict[key].append(dict2.get(key))

    print(final_dict)

输出:

{'NTID': ['ID', 'CN', 'INCHI']}

如果你想得到你所展示的元组结果:

final_dict={}
for key,value in dict1.items():
    final_dict[key]=value
    if key in dict2:
        final_dict[key]+=(dict2.get(key),)

print(final_dict)

输出:

{'NTID': ('ID', 'CN', 'INCHI')}

第二个你可以使用defaultdict:

dict1 = {'NTID': ('ID', 'CN')}

dict2 = {'NTID': 'INCHI'}

from collections import defaultdict

d=defaultdict(list)
for item in (dict1,dict2):
    for key,value in item.items():
        d[key].append(value)

print(d)

根据问题编辑更新:

dict_1={'1-4-HYDROXYPHENYL': [],
 '4-AMINO-BUTYRATE': [('24', 'gamma-aminobutyrate (GABA)'),
  ('172', 'alpha-ketoglutarate'),
  ('173', 'succinate'),
  ('399', 'Succinate semialdehyde'),
  ('111', 'putrescine'),
  ('114', '4-guanidinobutanoate'),
  ('115', '4-acetamidobutanoate')],
 'ACETYLCHOLINE': [],
 'ASN': [('1', 'glycine'),
  ('45', 'tyrosine'),
  ('74', 'leucine'),
  ('90', 'methionine'),
  ('80', 'valine')]}



dict_2={'1-4-HYDROXYPHENYL': [],
 '4-AMINO-BUTYRATE': ['InChI=1S/C4H9NO2/c5-3-1-2-4(6)7/h1-3,5H2,(H,6,7)',
  'InChI=1S/C5H6O5/c6-3(5(9)10)1-2-4(7)8/h1-2H2,(H,7,8)(H,9,10)/p-2',
  'InChI=1S/C4H6O4/c5-3(6)1-2-4(7)8/h1-2H2,(H,5,6)(H,7,8)/p-2',
  'InChI=1S/C4H6O3/c5-3-1-2-4(6)7/h3H,1-2H2,(H,6,7)/p-1',
  'InChI=1S/C4H12N2/c5-3-1-2-4-6/h1-6H2/p+2',
  'InChI=1S/C5H11N3O2/c6-5(7)8-3-1-2-4(9)10/h1-3H2,(H,9,10)(H4,6,7,8)',
  'InChI=1S/C6H11NO3/c1-5(8)7-4-2-3-6(9)10/h2-4H2,1H3,(H,7,8)(H,9,10)/p-1'],
 'ACETYLCHOLINE': [],
 'ASN': ['InChI=1S/C9H11NO3',
  'InChI=1S/C9H11NO2/c10-8',
  'InChI=1S/C3H7NO2/c1-2(4)3(5)6',
  'InChI=1S/C5H9NO2/c7-5(8)4-2-1-3',
  'InChI=1S/C4H9NO3/c1-2(6)3',
  'InChI=1S/C4H8N2O3/c5-2(4(8)',
  'InChI=1S/C6H13NO2/c1-3-4(2)',
  'InChI=1S/C6H9N3O2/c7-5(6(10)',
  'InChI=1S/C4H7NO4/c5-2(4(8)9)',
  'InChI=1S/C4H4O5/c5-2(4(8)9)1-',
  'InChI=1S/C3H7NO2S/c4-2(1-7)3(5)',
  'InChI=1S/C5H10N2O3/c6-3(5(9)']}


final_dict={}
for key,value in dict_1.items():
    if key in dict_2:
        for zip_value in zip(value,dict_2.get(key)):
            if key not in final_dict:
                final_dict[key]=[zip_value]
            else:
                final_dict[key].append(zip_value)



print(final_dict)

输出:

{'ASN': [(('1', 'glycine'), 'InChI=1S/C9H11NO3'), (('45', 'tyrosine'), 'InChI=1S/C9H11NO2/c10-8'), (('74', 'leucine'), 'InChI=1S/C3H7NO2/c1-2(4)3(5)6'), (('90', 'methionine'), 'InChI=1S/C5H9NO2/c7-5(8)4-2-1-3'), (('80', 'valine'), 'InChI=1S/C4H9NO3/c1-2(6)3')], '4-AMINO-BUTYRATE': [(('24', 'gamma-aminobutyrate (GABA)'), 'InChI=1S/C4H9NO2/c5-3-1-2-4(6)7/h1-3,5H2,(H,6,7)'), (('172', 'alpha-ketoglutarate'), 'InChI=1S/C5H6O5/c6-3(5(9)10)1-2-4(7)8/h1-2H2,(H,7,8)(H,9,10)/p-2'), (('173', 'succinate'), 'InChI=1S/C4H6O4/c5-3(6)1-2-4(7)8/h1-2H2,(H,5,6)(H,7,8)/p-2'), (('399', 'Succinate semialdehyde'), 'InChI=1S/C4H6O3/c5-3-1-2-4(6)7/h3H,1-2H2,(H,6,7)/p-1'), (('111', 'putrescine'), 'InChI=1S/C4H12N2/c5-3-1-2-4-6/h1-6H2/p+2'), (('114', '4-guanidinobutanoate'), 'InChI=1S/C5H11N3O2/c6-5(7)8-3-1-2-4(9)10/h1-3H2,(H,9,10)(H4,6,7,8)'), (('115', '4-acetamidobutanoate'), 'InChI=1S/C6H11NO3/c1-5(8)7-4-2-3-6(9)10/h2-4H2,1H3,(H,7,8)(H,9,10)/p-1')]}

如果您不想要那些额外的括号,请稍作修改:

final_dict={}
for key,value in dict_1.items():
    if key in dict_2:
        for zip_value in zip(value,dict_2.get(key)):

            if key not in final_dict:
                final_dict[key]=[zip_value[0][0],zip_value[0][1],zip_value[1]]
            else:
                final_dict[key].append((zip_value[0][0],zip_value[0][1],zip_value[1]))



print(final_dict)

输出:

{'ASN': ['1', 'glycine', 'InChI=1S/C9H11NO3', ('45', 'tyrosine', 'InChI=1S/C9H11NO2/c10-8'), ('74', 'leucine', 'InChI=1S/C3H7NO2/c1-2(4)3(5)6'), ('90', 'methionine', 'InChI=1S/C5H9NO2/c7-5(8)4-2-1-3'), ('80', 'valine', 'InChI=1S/C4H9NO3/c1-2(6)3')], '4-AMINO-BUTYRATE': ['24', 'gamma-aminobutyrate (GABA)', 'InChI=1S/C4H9NO2/c5-3-1-2-4(6)7/h1-3,5H2,(H,6,7)', ('172', 'alpha-ketoglutarate', 'InChI=1S/C5H6O5/c6-3(5(9)10)1-2-4(7)8/h1-2H2,(H,7,8)(H,9,10)/p-2'), ('173', 'succinate', 'InChI=1S/C4H6O4/c5-3(6)1-2-4(7)8/h1-2H2,(H,5,6)(H,7,8)/p-2'), ('399', 'Succinate semialdehyde', 'InChI=1S/C4H6O3/c5-3-1-2-4(6)7/h3H,1-2H2,(H,6,7)/p-1'), ('111', 'putrescine', 'InChI=1S/C4H12N2/c5-3-1-2-4-6/h1-6H2/p+2'), ('114', '4-guanidinobutanoate', 'InChI=1S/C5H11N3O2/c6-5(7)8-3-1-2-4(9)10/h1-3H2,(H,9,10)(H4,6,7,8)'), ('115', '4-acetamidobutanoate', 'InChI=1S/C6H11NO3/c1-5(8)7-4-2-3-6(9)10/h2-4H2,1H3,(H,7,8)(H,9,10)/p-1')]}

【讨论】:

  • mmm... 我的输出看起来有点不同:我得到一个像 {'NTID'1: (('ID1', 'CN1'), ('ID2', 'CN2') , ('ID3', 'CN3')) ['INCHI1','INCHI2', 'INCHI3' ])}
  • @smvpfm 我回答了你提供给我的数据。给我您的实际数据的样本数据,以便我查看问题。
  • 当然,我插入了我的字典示例
  • 不完全是我的输出应该是一个包含元组列表的字典,请检查我的更新
【解决方案2】:

你可以试试这个:

dict3 = {name: [(*a, b) for a, b in zip(v, dict2[name])]
    for name, v in dict1.items()
}

据我了解,dict1dict2 具有相同的键和结构,但存储与同一事物相关的不同信息,您希望将它们合并为一个共同的 dict3

【讨论】:

    【解决方案3】:
    dict3 = dict(zip(dict1.keys(), zip(dict1.values(),dict2.values())))
    

    【讨论】:

    • 代码总是好的,但它也有助于围绕代码如何解决原始问题添加一些 cmets 或上下文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2016-07-11
    • 1970-01-01
    相关资源
    最近更新 更多