【问题标题】:Getting Lists of Summed Nested Dictionary Values获取求和的嵌套字典值列表
【发布时间】:2018-05-28 11:54:57
【问题描述】:

我正在尝试编写程序的一部分,其中用户输入一个目标词 (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。 dict 'z' 的情况相同,其中键 'one''green' 出现在 'x''z' 中,将它们的值 11 放入嵌套列表中。

这是我所拥有的功能失调代码的表示:

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 个列表?我对字典很陌生。

【问题讨论】:

  • 你的问题很难理解。你能\或理解它的人重新措辞吗?
  • @Ev.Kounis 我有很多解释要做,抱歉。所以从根本上说,它应该创建 2 个嵌套列表,其中来自 mainDict 的值的总和与给定的 targetWord 和查找共有的键是用户输入。从技术上讲,这两个列表最终应该打印相同的内容。

标签: python python-3.x list dictionary sum


【解决方案1】:

字典上的.keys() method 给你一个dictionary view,它可以像一个集合。这意味着您可以在两个字典的关键视图之间进行交集!您想要初始 targetDictlookup 中命名的字典之间的交集:

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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多