Обновление ранее существующих значений во вложенном словаре с помощью циклов - PullRequest
0 голосов
/ 28 мая 2018

Этот запрос является чем-то вроде продолжения моего предыдущего вопроса: Создание словарей из списков внутри словарей

, что дало мне:

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']]

, в которые вложены списки строк,подсписки, в которых я буду проверять наличие строки.

Для увеличения счетчика соответствующая строка ключа также должна присутствовать в том же списке.Таким образом, счетчики в «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 и вложенный dict присутствуют в подсписке).Я пытаюсь НЕ генерировать новый словарь, и я пытаюсь НЕ полагаться на импортированные модули, так как мне не хватает их понимания, что, вероятно, снова запутает меня в будущем.

Пожалуйста, посоветуйте мне, как мне следуетисправить мой код и как правильно индексировать числовое значение, если я хочу использовать число для будущих вычислений и сравнений.

Спасибо

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

То же, что и ниже, но, думаю, более читабельно.

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
0 голосов
/ 28 мая 2018

Одним из способов является итерация 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}}
0 голосов
/ 28 мая 2018

Сначала разделите ключи (k) и значения (v) primaryDict, используя метод .items().
Далее, циклически переберите все element в objList и проверьтеесли включен каждый ключ (например, «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}}
...