在Python中的字典中从列表中删除元素

时间:2019-06-04 13:01:46

标签: python list dictionary deep-copy

{  
   'tbl':'test',
   'col':[  
      {  
         'id':1,
         'name':"a"
      },
      {  
         'id':2,
         'name':"b"
      },
      {  
         'id':3,
         'name':"c"
      }
   ]
}

我有一本类似上面的字典,我想从里面的列表中删除带有id=2的元素。我浪费了半天,想知道为什么modify2无法使用del操作。尝试过pop,它似乎可以正常工作,但我不完全理解为什么del不起作用。

是否有一种使用del或pop删除的方法是解决此用例的理想方法?

import copy

test_dict = {'tbl': 'test', 'col':[{'id':1, 'name': "a"}, {'id':2, 'name': "b"}, {'id':3, 'name': "c"}]}

def modify1(dict):
    new_dict = copy.deepcopy(dict)
    # new_dict = dict.copy()
    for i in range(len(dict['col'])):
        if dict['col'][i]['id'] == 2:
            new_dict['col'].pop(i)
    return new_dict

def modify2(dict):
    new_dict = copy.deepcopy(dict)
    # new_dict = dict.copy()
    for i in new_dict['col']:
        if i['id']==2:
            del i
    return new_dict

print("Output 1 : " + str(modify1(test_dict)))
print("Output 2 : " + str(modify2(test_dict)))

输出:

Output 1 : {'tbl': 'test', 'col': [{'id': 1, 'name': 'a'}, {'id': 3, 'name': 'c'}]}
Output 2 : {'tbl': 'test', 'col': [{'id': 1, 'name': 'a'}, {'id': 2, 'name': 'b'}, {'id': 3, 'name': 'c'}]}

我尝试寻找类似问题的答案,但没有找到能消除我困惑的答案。

5 个答案:

答案 0 :(得分:3)

在Python 3中,您可以执行以下操作:

test_dict = {**test_dict, 'col': [x for x in test_dict['col'] if x['id'] != 2]}

答案 1 :(得分:2)

del i只是告诉解释器i(碰巧引用字典的任意局部变量/名称)不应再引用该字典。它不会改变该词典的内容。

这可以在http://www.pythontutor.com/visualize.html上看到:

del i之前。注意i引用了第二个字典(用蓝线表示):

enter image description here

del i之后。请注意,如何从本地名称空间(蓝色框)中删除本地变量i,但它引用的字典仍然存在。

enter image description here

del i(修改对字典的引用)相反,dict.pop(key)修改词典

答案 2 :(得分:1)

这是一种使用理解的方法。

例如:

data = {'tbl': 'test', 'col': [{'id': 1, 'name': 'a'}, {'id': 2, 'name': 'b'}, {'id': 3, 'name': 'c'}]}

data['col'] = [i for i in data['col'] if i["id"] != 2]
print(data)

输出:

{'col': [{'id': 1, 'name': 'a'}, {'id': 3, 'name': 'c'}], 'tbl': 'test'}

答案 3 :(得分:1)

不起作用的原因是您使用的是错误的错误代码。

如果您有字典d = {'a': [{'id':1}, {'id':2}]},然后使用del d['a'][1]删除字典的第二个元素,则返回 d = {'a': [{'id':1}]}

因此,对于您的问题,您需要反复查找ID 2在列表中的位置,然后只需执行del dict['col'][ix],其中ix是ID 2在列表中的索引

答案 4 :(得分:1)

您无法在for循环中删除由迭代变量(i)引用的元素

l = [1,2,3]
for i in l:
    if i == 2:
        del i

不起作用。 l仍为[1,2,3]

您可以做的就是获取该元素的索引,然后使用索引删除

l = [1,2,3]
for idx, elem in enumerate(l):
    if elem == 2:
        del l[idx]