如何根据python中的条件从字典中的列表中删除元素

时间:2019-07-09 15:48:30

标签: python list dictionary

我有一个字典,其中的键是字符串,值是字符串列表。以下是我正在使用的更大词典的示例。我遇到的一个问题是键有时会出现在值中(即键``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 个答案:

答案 0 :(得分:3)

您没有正确访问列表。您想这样做:

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

但是您可以通过以下方式简化此检查:

for k,v in cat_map.items():
    if k in v:
        v.remove(k)

答案 1 :(得分:1)

您可以使用字典理解来构建要保留的字典:

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

如果您想保留条目但只更改值,则可以使用(如Tomerikoo在评论中观察到的那样):

cat_map = {k:[x for x in v if x != k] for k,v in cat_map.items()}

答案 2 :(得分:0)

问题

  • 使用del cat_map[cat_map[k].index(item)]cat_map[k].index(item)将返回item的索引,该索引是cat_map词典中不可用的整数。因此, KeyError

使用列表 remove ,但仅在此之前进行成员资格检查。

代码如下:

for k, v in cat_map.items():
    if k in v:
        v.remove(k)

答案 3 :(得分:0)

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]