Удаление определенных значений словаря внутри цикла - PullRequest
0 голосов
/ 15 мая 2018

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

Проблема в том, что он не следует шаблону.

  • Если элемент принадлежит V1, мне нужно сохранить его в словаре. (V1 - это список всех значений, которые выводят терминал, эти парни - единственные, которые мне нужно сохранить в моем словаре, но это не так просто)

  • Если элемент не принадлежит V1, а значения словаря являются строкой, мне нужно удалить элемент.

  • Если элемент не принадлежит V1, а значения словаря - это список, мне нужно проверить, является ли он единственным элементом в этом списке, если это так, удалить Value.

Здесь неисправный цикл. Я напечатал части, которые я не могу понять, логика при изменении словаря.

counter = 0
for k,v in derivations.items():
    derivationsCount = len(v)

    while counter < derivationsCount:
        if lista_ou_string(v[counter]): # returns True for lists, False for else
            sizeOfList = len(v[counter])
            counter2 = 0

            while counter2 <= (sizeOfList - 1):
                if v[counter][counter2] not in V1:
                    if derivationsCount == 1:
                        print("# NEED TO DELETE BOTH KEY AND VALUE FROM derivatios.items()")
                    else:
                        print("# NEED TO DELETE ONLY THE VALUE FROM derivations.items()")
                counter2 += 1

        else: # strings \/
            if v[counter] not in V1:
                if derivationsCount == 1:
                    print("# NEED TO DELETE BOTH KEY AND VALUE FROM derivatios.items()")
                else:
                    print("# NEED TO DELETE ONLY THE VALUE FROM derivations.items()")
            else:
                print("# DO NOT DELETE ANYTHING! ALL LISTS ELEMENTS BELONGS TO 'V1'")
        counter += 1

Ответы [ 2 ]

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

Человек не хочет изменять словарь (или список) во время его циклического перемещения. Поэтому я создаю копию derivations - new_derivations и изменяю это new_derivations:

import copy
new_derivations = copy.deepcopy(derivations)
for k, v in derivations.items():
    for vi in v:
        if (lista_ou_string(vi) and not set(vi).issubset(V1)) or vi not in V1:
            if len(v) == 1:
                # NEED TO DELETE BOTH KEY AND VALUE FROM derivatios.items()
                del new_derivations[k]
                break
            else:
                # NEED TO DELETE ONLY THE VALUE FROM derivations.items()
                idx = new_derivations[k].index(vi)
                del new_derivations[k][idx]

Я бы на самом деле реализовал приведенный выше код иначе: вместо того, чтобы думать об удалении элементов из derivations, вместо того, чтобы думать, когда элемент должен быть добавлен в список. Тогда код становится намного проще:

new_derivations = {}
for k, v in derivations.items():
    nv = [vi for vi in v if ((isinstance(vi, list) and set(vi).issubset(V1))
                             or vi in V1)]
    if nv:
        new_derivations[k] = nv
0 голосов
/ 15 мая 2018

, если вы хотите удалить пару ключ-значение из словаря, используйте del:

>>> my_dictionary = {'foo':'bar', 'boo':'baz'}
>>> del my_dictionary['foo']
>>> my_dictionary
{'boo': 'baz'}

если вы хотите удалить значение, но сохранить ключ, вы можете попробовать назначить ключ None:

>>> my_dictionary = {'foo':'bar', 'boo':'baz'}
>>> my_dictionary['foo'] = None
>>> my_dictionary
{'foo': None, 'boo': 'baz'}
...