使用循环

时间:2018-05-27 21:58:47

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

此查询与我之前提出的问题有关: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']]

  2. 其中嵌套字符串列表,那些是我将检查字符串出现的子列表。

    1. 为了使计数器上升,密钥的相应字符串也必须出现在同一列表中。因此,'a':{}中的计数器只有在字符串'a'和'a':{}内的目标字符串值都存在时才会上升。
    2. 因此,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的键和子列表中存在的嵌套字典)。我试图不生成一个新词典,我不想依赖导入的模块,因为我对它们缺乏了解,这可能会在将来再次让我失望。

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

      由于

3 个答案:

答案 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}}