【问题标题】:Updating Pre-Existing Values in nested Dictionary with Loops使用循环更新嵌套字典中的预先存在的值
【发布时间】:2018-11-06 11:42:27
【问题描述】:

这个查询是我上一个问题的后续: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}}

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

  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

这看起来非常恶心,不起作用,清楚地表明我对索引缺乏了解。

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

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

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

谢谢

【问题讨论】:

  • 您能在这里解释一下您的要求吗:how I should index the numeric value properly if I wish to use the number for future calculations and comparisons
  • @andrew_reece 我想我现在明白了如何做到这一点,因为我可以正确识别哪个是字符串,哪个实际上是字典。谢谢。

标签: python python-3.x dictionary indexing word-count


【解决方案1】:

首先,使用.items()方法拆分primaryDict的键(k)和值(v)。
接下来,循环遍历objList 中的每个element,并检查是否包含每个键(例如“a”、“b”)。
如果是,则检查v 的键(即“汽车”、“公共汽车”等特定对象)是否也在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}}

【讨论】:

    【解决方案2】:

    一种方法是迭代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}}
    

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-03
        • 2021-08-10
        • 2021-07-16
        • 2019-07-16
        • 2023-03-12
        • 2021-05-30
        相关资源
        最近更新 更多