在嵌套字典中获取公共值

2024-03-28 18:45:47 发布

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

我有一个嵌套字典,如何获得具有公共键值(如37、74等)的值:

myDict = {0: {37.0:  {'C23H27O9': 'C22H23O10'}},
          1: {74.0:  {'C23H27O9': 'C21H19O11'}},
          2: {111.0: {'C23H27O9': 'C20H15O12'}},
          3: {148.0: {'C23H27O9': 'C19H11O13'}},
          4: {37.0:  {'C22H23O10': 'C21H19O11'}},
          5: {74.0:  {'C22H23O10': 'C20H15O12'}},
          6: {111.0: {'C22H23O10': 'C19H11O13'}},
          7: {37.0:  {'C21H19O11': 'C20H15O12'}},
          8: {74.0:  {'C21H19O11': 'C19H11O13'}},
          9: {37.0:  {'C20H15O12': 'C19H11O13'}}
         }

期望输出:

37.0 --> C23H27O9: C22H23O10: C21H19O11 : C20H15O12 : C19H11O13
74.0 --> C23H27O9 : C21H19O11 : C19H11O13
...

Tags: 字典mydict键值c22h23o10c21h19o11c20h15o12c23h27o9c19h11o13
2条回答

您可以使用itertools.groupby

from itertools import groupby as gb
myDict = {0: {37.0: {'C23H27O9': 'C22H23O10'}}, 1: {74.0: {'C23H27O9': 'C21H19O11'}}, 2: {111.0: {'C23H27O9': 'C20H15O12'}}, 3: {148.0: {'C23H27O9': 'C19H11O13'}}, 4: {37.0: {'C22H23O10': 'C21H19O11'}}, 5: {74.0: {'C22H23O10': 'C20H15O12'}}, 6: {111.0: {'C22H23O10': 'C19H11O13'}}, 7: {37.0: {'C21H19O11': 'C20H15O12'}}, 8: {74.0: {'C21H19O11': 'C19H11O13'}}, 9: {37.0: {'C20H15O12': 'C19H11O13'}}}
d = sorted([(a, [j for k in b.items() for j in k]) for i in myDict.values() for a, b in i.items()], key=lambda x:x[0])
r = [(a, [*{i for _, j in b for i in j}]) for a, b in gb(d, key=lambda x:x[0])]

输出:

[(37.0, ['C19H11O13', 'C20H15O12', 'C21H19O11', 'C22H23O10', 'C23H27O9']), (74.0, ['C19H11O13', 'C20H15O12', 'C21H19O11', 'C22H23O10', 'C23H27O9']), (111.0, ['C20H15O12', 'C19H11O13', 'C23H27O9', 'C22H23O10']), (148.0, ['C23H27O9', 'C19H11O13'])]

看起来您需要来自最内部字典的所有键和值的集合,保留它们遇到的顺序。你知道吗

这似乎起到了作用:

from collections import defaultdict

result = defaultdict(list)
for _, outerDict in myDict.items():
    for innerKey, innerDict in outerDict.items():
        for k, v in innerDict.items():
            if k not in result[innerKey]:
                result[innerKey].append(k)
            if v not in result:
                result[innerKey].append(v)

在此之后,resultlistdict

>>> for key, values in result.items():
>>>    print(key, values)

37.0 ['C23H27O9', 'C22H23O10', 'C21H19O11', 'C20H15O12', 'C19H11O13']
74.0 ['C23H27O9', 'C21H19O11', 'C22H23O10', 'C20H15O12', 'C19H11O13']
111.0 ['C23H27O9', 'C20H15O12', 'C22H23O10', 'C19H11O13']
148.0 ['C23H27O9', 'C19H11O13']

你可以格式化你喜欢的输出,我的假设是,你只需要数据。你知道吗

相关问题 更多 >