使用循环更新嵌套字典中的预先存在的值
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}}
所以我这次 运行 遇到的问题是,我需要为给定一组条件的嵌套列表中每次出现的字符串更新数值,即:
在单独的子列表列表中,示例:
objList = [['car', 'bus', 'train', 'apple', 'b'], ['apple', 'car', 'bike', 'a', 'b']]
其中嵌套了字符串列表,这些是我将在其中检查是否出现字符串的子列表。
- 为了使计数器增加,键对应的字符串也必须出现在同一个列表中。因此,'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}}
这个查询有点像我之前的问题:
我得到了:
primaryDict = {'list_a':[{'apple':0}, {'orange':0}], 'list_b':[{'car':0}, {'bus':0}]}
我将其更改为以下内容以便于处理:
primaryDict = {'a': {'car': 0, 'bus': 0}, 'b': {'apple': 0, 'orange': 0}}
所以我这次 运行 遇到的问题是,我需要为给定一组条件的嵌套列表中每次出现的字符串更新数值,即:
在单独的子列表列表中,示例:
objList = [['car', 'bus', 'train', 'apple', 'b'], ['apple', 'car', 'bike', 'a', 'b']]
其中嵌套了字符串列表,这些是我将在其中检查是否出现字符串的子列表。
- 为了使计数器增加,键对应的字符串也必须出现在同一个列表中。因此,'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
.
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}}