У меня есть словарь, где ключи являются строками, а значения являются списками строк. Ниже приведен пример из гораздо большего словаря, с которым я работаю. Проблема, с которой я сталкиваюсь, заключается в том, что ключи иногда появляются в значениях (т. Е. Ключ «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
0
user9105277 9 Июл 2019 в 18:48

3 ответа

Лучший ответ

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

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

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

for k,v in cat_map.items():
    if k in v:
        v.remove(k)
3
Tomerikoo 9 Июл 2019 в 15:51
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
Amine Messaoudi 10 Июл 2019 в 13:18

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

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()}
1
John Coleman 9 Июл 2019 в 16:02