蟒蛇 - 从列表中删除字典,如果存在
我想从列表中删除字典,如果它已经存在,但它似乎并没有工作。任何人都可以看到我在做什么错还是劝我,我应该做蟒蛇 - 从列表中删除字典,如果存在
new_dict = {'value': 'some value', 'key': 'someKey'}
if new_dict in my_list:
my_list.remove(new_dict)
new_list是字典的一个列表,其中new_dict绝对是
如果new_dict
是“肯定”的my_list
,然后my_list.remove(new_dict)
应该做的伎俩(即无需对if new_dict in my_list
,只是减缓下来)。
这个。为了安全起见,你可以将它封装在'try/except'中,然后处理'ValueError'。 –
在大多数情况下,它是聪明建立一个新的列表:
new_list = [ dd for dd in my_list if not dd is new_dict ]
这是典型的函数式编程风格,因为它避免了副作用。想象一下,如果你在一个函数或方法中使用你的解决方案。在大多数情况下,您只需要修改列表用于内部目的,然后修改输入参数是危险的。
你确定要在这里使用'is'而不是== ==吗? –
这不是问题的答案。这是另一种不会改变什么的方式,如果他得到的东西不适合他。就我个人而言,我非常不同意你的观点,即“在大多数情况下,建立一个新名单是很聪明的”。我偶尔会说它会是需要的,但几乎总是会效率低下。 –
@Tim:这取决于。但是,作为使用“in”的问题,你是对的,它应该是“==”。 – rocksportrocker
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
它适用于我的两本字典。
您的问题可能来自于这样的事实:从列表中删除而重复的相同的列表不安全。你想要做的是一样的东西:
copied_list = my_list[:]
if new_dict in copied_list:
my_list.remove(new_dict)
这样,你遍历表的副本,并从原来的删除。
虽然这可能不是您的问题的原因。这将是有趣的,看看:
- 你如何建立
my_list
- 你的循环后
my_list
做什么,即你怎么知道你的字典里没有被移除
这对我的作品。你如何构建my_list? – Louis