Как удалить элементы из списков в словарях на основе условия в Python - PullRequest
0 голосов
/ 09 июля 2019

у меня есть словарь, где ключи - это строки, а значения - списки строк. Ниже приведен пример из гораздо большего словаря, с которым я работаю. Проблема, с которой я сталкиваюсь, заключается в том, что ключи иногда появляются в значениях (т. Е. Ключ «25 -3» содержит «25 -3», и я хотел бы чтобы удалить его.

cat_map = {'11-1': ['41-4', '43-1', '11-2', '43-6'],
 '11-2': ['41-4', '43-1', '11-2', '43-6'],
 '11-3': [],
 '11-9': [],
 '13-1': [],
 '13-2': [],
 '15-1': [],
 '15-2': [],
 '17-1': [],
 '17-2': [],
 '17-3': [],
 '19-1': [],
 '19-2': [],
 '19-3': [],
 '19-4': [],
 '21-1': [],
 '21-2': ['43-2', '33-9', '39-6', '39-9', '25-3', '39-3', '39-7'],
 '23-1': [],
 '23-2': [],
 '25-1': [],
 '25-2': [],
 '25-3': ['43-2', '37-1', '39-6', '25-3', '39-3'],

Я озадачен, почему ниже не работает

for k,v in cat_map.items():
    for item in v:
        if k == item:
            del cat_map[cat_map[k].index(item)]
        else:
            continue

См. Ошибку (KeyError2)

KeyError                                  Traceback (most recent call last)
<ipython-input-83-f4c2c0fde28b> in <module>
      2     for item in v:
      3         if k== item:
----> 4             del cat_map[cat_map[k].index(item)]
      5         else:
      6             continue

KeyError: 2

Ответы [ 4 ]

3 голосов
/ 09 июля 2019

У вас неправильный доступ к спискам. Вы хотели бы сделать:

del cat_map[k][cat_map[k].index(item)]

но вы можете упростить эту проверку:

for k,v in cat_map.items():
    if k in v:
        v.remove(k)
1 голос
/ 09 июля 2019

Вы можете использовать словарное понимание для создания словаря, который вы хотите сохранить:

cat_map = {k:v for k,v in cat_map.items() if not k in v}

Если вы хотите сохранить запись, но просто изменить значения, вы можете использовать (как замечает Томерику вкомментарии):

cat_map = {k:[x for x in v if x != k] for k,v in cat_map.items()}
0 голосов
/ 09 июля 2019
keys = list(cat_map.keys())

for key, value in cat_map.items():
    for index, element in enumerate(value):
        if element in key:
            del cat_map[key][index]
0 голосов
/ 09 июля 2019

Проблема :

  • Использование del cat_map[cat_map[k].index(item)], cat_map[k].index(item) вернет индекс элемента, который является целым числом, недоступным в словаре cat_map.Следовательно, KeyError.

Использовать список remove, но только с проверкой членства до этого.

Вот код:

for k, v in cat_map.items():
    if k in v:
        v.remove(k)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...