Python 使用循环更新嵌套字典中预先存在的值
这个问题是我上一个问题的后续问题: 这让我想到:Python 使用循环更新嵌套字典中预先存在的值,python,python-3.x,dictionary,indexing,word-count,Python,Python 3.x,Dictionary,Indexing,Word Count,这个问题是我上一个问题的后续问题: 这让我想到: primaryDict = {'list_a':[{'apple':0}, {'orange':0}], 'list_b':[{'car':0}, {'bus':0}]} 为了便于操作,我将其更改为以下内容: primaryDict = {'a': {'car': 0, 'bus': 0}, 'b': {'apple': 0, '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}}
因此,我这次遇到的问题是,给定一组条件,我需要更新嵌套列表中字符串每次出现的数值,即:
{'car':1, 'bus':0}, {'apple':2, 'orange':0}
因为“car”在列表中以“a”出现,而“bus”没有
我试图解决这个问题的尝试是混乱的循环,if类似于:
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的键和sublist中存在的嵌套dict)的情况下,循环并更新嵌套字典中的数值。我尽量不生成新词典,也尽量不依赖导入的模块,因为我对它们缺乏了解,这可能会在将来再次绊倒我
如果我希望在将来的计算和比较中使用数字,请建议我如何修复代码,以及如何正确索引数值
谢谢首先,使用.items()
方法拆分primaryDict
的键(k
)和值(v
)
接下来,在objList
中的每个元素上循环,并检查每个键(例如“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
方法更新必要的值。我们的想法是将O(n)列表比较替换为O(1)查找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}}
你能解释一下你在这里的要求吗:如果我想在以后的计算和比较中使用这个数字,我应该如何正确地索引这个数值
?@andrew_reece我想我知道该怎么做了,因为现在我可以正确地识别哪个是字符串,哪个实际上是字典。谢谢