关于python:获取Summed嵌套字典值的列表

Getting Lists of Summed Nested Dictionary Values

我正在尝试编写程序的一部分,其中用户输入一个目标词(targetWord = input()),分配一个嵌套字典,关键字与输入词相同。

例如:

1
2
3
4
5
mainDict = {
    'x': {'one': 1, 'blue': 1, 'green' :1},
    'y': {'red': 1, 'blue': 2, 'two': 1},
    'z': {'one': 1, 'green': 1, 'red': 1}
}

其中嵌套字典中的所有值都被分配为整数。

用户可以输入'x',程序将向其分配:

1
targetDict = mainDict['x']

然后,程序应允许用户再次输入单词,但这次输入的每个单词都会附加到查找列表中,例如用户输入'y',然后输入'z'

1
lookup = ['y', 'z']

然后,程序应该运行嵌套字典,对于每个具有对应键的值(如targetDict中所示),只将值附加到新的嵌套列表中,并添加嵌套字典值的任何值。因此,本节的输出应该是:

1
targetOutput = [[2], [1, 1]]

因为在嵌套的dict 'y'中,只有'blue'是一个公共密钥,它的值2被放在一个列表中,然后附加到targetOutput上。与dict 'z'相同,其中'one''green'键同时出现在'x''z'中,将它们的值11放入嵌套列表。

以下是我所拥有的功能失调代码的一个表示:

1
2
3
4
5
6
7
8
9
10
11
12
targetOutput = []
targetDict = mainDict[targetWord]
for tkey in targetDict:
    tt = []
    for word in lookup:
        for wkey in primaryDict[word]:
            if tkey == wkey:
                tt.append(targetDict[tkey])
tl.append(sum(tt))


print((pl))

最后的sum函数是因为我的实际最终输出应该是嵌套列表中值的总和,类似于:

1
tl = [[2], [2]]

我还试图实现相反的结果,在查找中的每个键的另一个列表中,它返回一个嵌套列表,其中包含targetWord字典还具有用于的键的每个值的总和,例如:

1
ll = [[2], [2]]

我的问题是,如何修复我的代码,以便它输出上面的2个列表?我对字典很陌生。


字典上的.keys()方法给您一个字典视图,它可以像一个集合一样工作。这意味着您可以在两个字典的关键视图之间进行交叉!您需要初始targetDictlookup中命名的字典之间的交集:

1
2
3
4
for word in lookup:
    other_dict = mainDict[word]
    common_keys = targetDict.keys() & other_dict
    targetOutput.append([other_dict[common] for common in common_keys])

targetDict.keys() & other_dict表达式在这里产生交集:

1
2
3
4
5
6
7
8
9
10
>>> mainDict = {
...     'x': {'one': 1, 'blue': 1, 'green' :1},
...     'y': {'red': 1, 'blue': 2, 'two': 1},
...     'z': {'one': 1, 'green': 1, 'red': 1}
... }
>>> targetDict = mainDict['x']
>>> targetDict.keys() & mainDict['y']
{'blue'}
>>> targetDict.keys() & mainDict['z']
{'green', 'one'}

[other_dict[common] for common in common_keys]列表理解获取这些键,并从其他字典中查找它们的值。

如果要求和这些值,只需将相同的值序列传递给sum()函数:

1
2
3
4
5
for word in lookup:
    other_dict = mainDict[word]
    common_keys = targetDict.keys() & other_dict
    summed_values = sum(other_dict[common] for common in common_keys)
    targetOutput.append(summed_values)

在另一个列表中包装求和值没有意义,因为只有一个求和。上面给出了一个带有[2, 2]targetOutput列表,而不是[[2], [2]]列表。