Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用循环更新嵌套字典中预先存在的值_Python_Python 3.x_Dictionary_Indexing_Word Count - Fatal编程技术网

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}}
因此,我这次遇到的问题是,给定一组条件,我需要更新嵌套列表中字符串每次出现的数值,即:

  • 在子列表的单独列表中,例如:

    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”没有

    我试图解决这个问题的尝试是混乱的循环,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我想我知道该怎么做了,因为现在我可以正确地识别哪个是字符串,哪个实际上是字典。谢谢