【问题标题】:python - remove dictionary from list if existspython - 如果存在则从列表中删除字典
【发布时间】:2011-09-20 11:44:35
【问题描述】:

我正在尝试从列表中删除已存在但似乎不起作用的字典。谁能看到我做错了什么或建议我应该怎么做

new_dict = {'value': 'some value', 'key': 'someKey'}
if new_dict in my_list:
    my_list.remove(new_dict)

new_list 是 new_dict 肯定在其中的字典列表

【问题讨论】:

  • 这对我有用。你如何构建 my_list ?

标签: python


【解决方案1】:

如果new_dictmy_list 中“肯定”,那么my_list.remove(new_dict) 应该可以解决问题(即,不需要if new_dict in my_list,这只会减慢速度)。

【讨论】:

  • 这个。为了安全起见,您可以将其包装在 try/except 中,然后处理 ValueErrors。
【解决方案2】:
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

它对我的两个词典都有效。

【讨论】:

    【解决方案3】:

    在大多数情况下,建立一个新列表是很聪明的:

     new_list = [ dd for dd in my_list if not dd is new_dict ]
    

    这是典型的函数式编程风格,因为它避免了副作用。想象一下,如果您在函数或方法中使用您的解决方案。在大多数情况下,您只需要为内部目的修改列表,那么修改输入参数是危险的。

    【讨论】:

    • 您确定要在此处使用is 而不是==
    • 这不是问题的答案。如果他所拥有的对他不起作用,这是另一种不会改变任何事情的方式。就个人而言,我强烈不同意你的说法,“在大多数情况下,建立一个新列表是聪明的”。我会说偶尔会需要它,但几乎总是效率低下。
    • @Tim:这取决于。但是作为问题使用“in”,你是对的,它应该是“==”。
    • @Chris:好的,那应该是评论,而不是答案。我并没有说函数式编程风格会给你最有效的代码。但除非遇到性能问题,否则我更喜欢这种风格。
    【解决方案4】:

    您的问题可能来自这样一个事实,即在迭代 same 列表时从列表中删除是不安全的。你想要做的是这样的:

    copied_list = my_list[:]
    if new_dict in copied_list:
        my_list.remove(new_dict)
    

    这样,您可以遍历列表的副本并从原始列表中删除。

    这可能不是您的问题的原因。看看会很有趣:

    • 你如何构建my_list
    • 循环后你对my_list 做了什么,即你如何意识到你的字典没有被删除

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 2017-07-04
      • 2021-08-19
      • 2022-10-14
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多