Удалить элемент в словаре списков - PullRequest
0 голосов
/ 01 апреля 2019

Я работаю над кодом Python для удаления определенных элементов в словаре списков.

dict ={'s': ['a','b'],'d': ['c','d'],'g': ['e','f']}
values = ['a','c','f']

list2 ={i:j.remove(value) for i,j in dict.items() for k in j for value in values if value in k}

print(list2)

Ниже работает код, дающий ожидаемый результат.Я сталкиваюсь с проблемой понимания (вышеупомянутый код)

for i,j in dict.items():

    for k in j:

        for value in values:

            if value in k:

                j.remove(value)

Я не уверен, почему понимание не работает.Пожалуйста, помогите мне с эффективным способом решения этого

Фактический результат:

{'s': None, 'd': None, 'g': None}

Ожидаемый результат:

{'s': ['b'], 'd': ['d'], 'g': ['e']}

Ответы [ 3 ]

0 голосов
/ 01 апреля 2019

Использование zip():

Для понимания :

dict_ ={'s': ['a','b'],'d': ['c','d'],'g': ['e','f']}
values = ['a','c','f']

for (k,v), elem  in zip(dict_.items(), values):
    if elem in v:
        v.remove(elem)
print(dict_)

Использование dict-comprehension:

Думайте об этом как:

Если элемент списка значений равен не в списке значение из ключ в dict_

print({k:v for (k,v), elem  in zip(dict.items(), values) if elem not in v })

ВЫХОД :

{'s': ['b'], 'd': ['d'], 'g': ['e']}
0 голосов
/ 01 апреля 2019

Вместо того, чтобы пытаться изменить середину итерации списка, просто выполните проверки членства в values, перебирая членов j:

d ={'s': ['a','b'],'d': ['c','d'],'g': ['e','f']}
values = ['a','c','f']

list2 ={i: [a for a in j if a not in values] for i,j in d.items()}

print(list2)
{'s': ['b'], 'd': ['d'], 'g': ['e']}

Как примечание, я также удалил имя переменной dict, потому что оно затеняет встроенное. Это определенно то, чего следует избегать, потому что позже вы можете столкнуться с каким-то сомнительным поведением:


dict = {'a': 1}

d = dict([('b',2), ('c',3)])

TypeError: 'dict' object is not callable
0 голосов
/ 01 апреля 2019

Я бы переименовал вашу переменную dict во что-то отличное от dict:

d = {'s': ['a','b'],'d': ['c','d'],'g': ['e','f']}
values = ['a','c','f']

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

d2 = {k:[i for i in v if i not in values] for k, v in d.items()}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...