我试图从列表中删除一个字典,如果它已经存在但它似乎没有工作。任何人都可以看到我做错了什么或建议我应该做什么
new_dict = {'value': 'some value', 'key': 'someKey'}
if new_dict in my_list:
my_list.remove(new_dict)
new_list是一个字典列表,其中new_dict肯定在
中答案 0 :(得分:7)
如果new_dict
中my_list
是“绝对”,那么my_list.remove(new_dict)
就应该做到这一点(即,不需要if new_dict in my_list
,只会减慢速度)。
答案 1 :(得分:4)
my_list = [1,{'value':'some value', 'key' :'somekey'}, 2, {'z':'z', 'x': 'x'}]
new_dict = {'value':'some value', 'key' :'somekey'}
#new_dict = {'z':'z', 'x': 'x'}
differ = 0
matched = 0
for element in my_list:
if type(element) is types.DictType and matched != 0:
differ = 0
# check if dictionary keys match
if element.viewkeys() == new_dict.viewkeys():
# check if dictionary values match
for key in element.keys():
if element[key] != new_dict[key]:
differ = 1
matched = 1
if differ != 1:
my_list.remove(new_dict)
print my_list
它适用于我的两个词典。
答案 2 :(得分:1)
在大多数情况下,建立一个新列表很聪明:
new_list = [ dd for dd in my_list if not dd is new_dict ]
这是函数式编程风格的典型特征,因为它避免了副作用。想象一下,如果您在函数或方法中使用您的解决方案。在大多数情况下,您只需要为内部目的修改列表,然后修改输入参数是危险的。
答案 3 :(得分:0)
您的问题可能来自于在迭代相同列表时从列表中删除是不安全的。你想做的是:
copied_list = my_list[:]
if new_dict in copied_list:
my_list.remove(new_dict)
这样,您可以遍历列表的副本并从原始列表中删除。
但这可能不是导致问题的原因。有趣的是看到:
my_list
my_list
做什么,即你怎么意识到你的字典没有被删除