使用循环更新嵌套字典中的预先存在的值

Updating Pre-Existing Values in nested Dictionary with Loops

这个查询有点像我之前的问题:

我得到了:

primaryDict = {'list_a':[{'apple':0}, {'orange':0}], 'list_b':[{'car':0}, {'bus':0}]}

我将其更改为以下内容以便于处理:

primaryDict = {'a': {'car': 0, 'bus': 0}, 'b': {'apple': 0, 'orange': 0}}

所以我这次 运行 遇到的问题是,我需要为给定一组条件的嵌套列表中每次出现的字符串更新数值,即:

  1. 在单独的子列表列表中,示例:

    objList = [['car', 'bus', 'train', 'apple', 'b'], ['apple', 'car', 'bike', 'a', 'b']]

其中嵌套了字符串列表,这些是我将在其中检查是否出现字符串的子列表。

  1. 为了使计数器增加,键对应的字符串也必须出现在同一个列表中。因此,'a':{} 中的计数器只有在字符串 'a' 以及 'a':{} 中的目标字符串值都存在时才会上升。

所以 primaryDict['a'] 和 primaryDict['b'] 的结果值应该是:

{'car':1, 'bus':0}, {'apple':2, 'orange':0}

因为 'car' 与 'a' 一起出现在列表中,而 'bus' 没有。

我试图解决这个问题的尝试是一堆乱七八糟的循环,如果类似于:

for k, v in primaryDict.items():
    for key in primaryDict:
        for sublist in objList:
            if key in sublist:
                for word in v:
                    if word in sublist:
                        primaryDict[key][v] = v.get(key, 0) + 1

这看起来绝对令人作呕,不起作用,并且清楚地表明我对索引缺乏了解。

我在各种尝试中的错误主要包括类型错误,其中我引用的字典显然是字符串,这意味着我引用的是列表中的键或值,而不是嵌套字典中的值。

目标:我要编写一个函数,它将在给定条件(primaryDict 的键和子列表中存在的嵌套字典)的情况下循环并更新嵌套字典中的数值。我正在尝试不生成新字典,并且我正在尝试不依赖导入的模块,因为我对它们缺乏了解,这可能会在未来再次绊倒我。

请告诉我应该如何修正我的代码,如果我希望将数字用于未来的计算和比较,我应该如何正确地索引数值。

谢谢

首先,使用.items()方法拆分primaryDict的键(k)和值(v)。
接下来,遍历 objList 中的每个 element 并检查是否包含每个键(例如 "a"、"b")。
如果是,则检查 v 的键(换句话说,"car"、"bus" 等特定对象)是否也在 objList 的元素中。
如果是这样,请将 1 添加到该对象的计数中。

for k, v in primaryDict.items():
    for element in objList:
        if k in element:
            for obj in v:
                if obj in element:
                    v[obj] += 1

primaryDict 
{'a': {'bus': 0, 'car': 1}, 'b': {'apple': 2, 'orange': 0}}

与下面相同,但我认为更具可读性。

for key, values in primaryDict.items():
  for sublist in objList:
    if key in sublist:
      for element in sublist:
        if element in values:
          values[element] += 1

一种方法是迭代 objList 并使用 set 方法来更新必要的值。这个想法是用 set.

的 O(1) 查找替换 O(n) 列表比较
primaryDict = {'a': {'car': 0, 'bus': 0},
               'b': {'apple': 0, 'orange': 0}}

objList = [['car', 'bus', 'train', 'apple', 'b'],
           ['apple', 'car', 'bike', 'a', 'b']]

for lst in objList:
    set_lst = set(lst)
    keys = set_lst & primaryDict.keys()
    values = set_lst - primaryDict.keys()
    for key in keys:
        for value in values & primaryDict[key].keys():
            primaryDict[key][value] += 1

print(primaryDict)        

{'a': {'car': 1, 'bus': 0}, 'b': {'apple': 2, 'orange': 0}}