我正在尝试编写用户输入目标字(targetWord = input()
)的程序的一部分,指定嵌套字典,其键与输入字相同。
例如:
mainDict = {
'x': {'one': 1, 'blue': 1, 'green' :1},
'y': {'red': 1, 'blue': 2, 'two': 1},
'z': {'one': 1, 'green': 1, 'red': 1}
}
其中嵌套字典中的所有值都被赋予整数。
用户可以输入程序将指定的'x'
:
targetDict = mainDict['x']
然后程序应允许用户再次输入单词,但这次输入中的每个单词都会附加到查找列表中,例如用户输入'y'
,然后'z'
:
lookup = ['y', 'z']
然后程序应该通过嵌套字典运行,并且对于具有targetDict
中相应键的每个值,只将值附加到新的嵌套列表并添加嵌套字典值的任何值。所以这部分的输出应该是:
targetOutput = [[2], [1, 1]]
因为在嵌套字典'y'
中,只有'blue'
是一个公共密钥,其值2
被放入列表中,然后附加到targetOutput
。与d 'z'
相同的情况,其中'one'
和'green'
中的键'x'
和'z'
都存在,其值为1
并将1
放入嵌套列表中。
以下是我所拥有的功能失调代码的表示:
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函数是因为我的实际最终输出应该是嵌套列表中值的总和,类似于:
tl = [[2], [2]]
我也试图反过来发生,在查找中每个键的另一个列表中,它返回一个嵌套列表,其中包含targetWord
字典也有一个键的每个值的总和,如:
ll = [[2], [2]]
我的问题是,如何修复我的代码,以便输出上面的2个列表?我对词典很新。
答案 0 :(得分:4)
字典上的.keys()
method会为您提供dictionary view,其行为类似于集。这意味着您可以在两个词典的关键视图之间进行交集!您希望初始targetDict
与lookup
中命名的词典之间的交集:
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
表达式在此处生成交集:
>>> 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()
函数:
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)
将总和值包装在另一个列表中是没有意义的,因为只有一个总和。上面的代码为targetOutput
列表[2, 2]
,而不是[[2], [2]]
。