此查询与我之前提出的问题有关:Creating Dictionaries from Lists inside of Dictionaries
让我:
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']]
其中嵌套字符串列表,那些是我将检查字符串出现的子列表。
因此,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
看起来非常恶心,不起作用,清楚地表明我对索引的理解不足。
我的错误来自各种尝试,主要由typeErrors组成,其中我引用的字典显然是字符串,这意味着我引用了列表中的键或值,而不是嵌套字典中的值。
目标:我将编写一个函数,该函数将循环并在给定条件的情况下更新嵌套字典中的数值(primaryDict的键和子列表中存在的嵌套字典)。我试图不生成一个新词典,我不想依赖导入的模块,因为我对它们缺乏了解,这可能会在将来再次让我失望。
请告诉我如何修复我的代码,以及如果我希望将该数字用于将来的计算和比较,我应该如何正确地索引数值。
由于
答案 0 :(得分:1)
首先,使用k
方法拆分v
的密钥(primaryDict
)和值(.items()
)。
接下来,循环遍历element
中的每个objList
并检查是否包含每个密钥(例如" a"," b")。
如果是,那么检查v
的键(换句话说,特定对象如" car"," bus"等)是否也在objList
的键中{1}}。
如果是,请将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}}
答案 1 :(得分: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
答案 2 :(得分:0)
一种方法是迭代objList
并使用set
方法更新必要的值。我们的想法是将O(n)列表比较替换为set
的O(1)查找。
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}}