【问题标题】:How to remove items from list conditionally [duplicate]如何有条件地从列表中删除项目[重复]
【发布时间】:2020-12-07 01:26:55
【问题描述】:

我有一个清单:

bigdumblist = [
    (0, 0, {'product_id': 2, 'product_uom_qty': 90}),
    (0, 0, {'product_id': 3, 'product_uom_qty': 5}),
    (0, 0, {'product_id': 5, 'product_uom_qty': 69})
]

我想从列表中删除 'product_id' 不是 2 或 3 的所有项目,如下所示:

[
   (0, 0, {'product_id': 2, 'product_uom_qty': 90}),
   (0, 0, {'product_id': 3, 'product_uom_qty': 5})
]

我尝试过的:

def not_in(item):
    if item["product_id"] is not 2 or 3:
        bigdumblist.remove((0, 0, {'product_id': 5, 'product_uom_qty': 69}))

for _, _, item in bigdumblist:
    not_in(item)
    break

print(bigdumblist)

这很有效,但显然包括(0, 0, {'product_id': 5, 'product_uom_qty': 69}) 不是解决方案。如何正确删除列表中的特定项目?

【问题讨论】:

  • 您不应该在迭代列表时修改它。
  • if item["product_id"] not in (2, 3):
  • 不反对制作新名单

标签: python


【解决方案1】:

你可以像这样使用列表推导:

[x for x in bigdumblist if x[2]['product_id'] in [2,3]]

【讨论】:

    【解决方案2】:

    您不应该在迭代列表时修改它。您可以先复制列表,但使用列表推导更简单。

    由于列表推导式指定要保留而不是删除哪些元素,因此必须反转条件。

    bigdumblist = [item for item in bigdumblist if item[2]['product_id'] in (2, 3)]
    

    注意

    if item["product_id"] is not 2 or 3:
    

    像被解析一样

    if (item["product_id"] is not 2) or 3:
    

    由于3 总是真实的,这个条件总是会成功。 andor 等逻辑运算符不会自动分布在关系运算符上。

    【讨论】:

      【解决方案3】:

      试试这样的条件列表推导......

      [x for x in bigdumblist if x[2]['product_id'] in [2,3]]

      【讨论】:

        【解决方案4】:

        你真的应该对这种过滤器使用列表推导,像这样:

        bigdumblist = [
            (0, 0, {'product_id': 2, 'product_uom_qty': 90}),
            (0, 0, {'product_id': 3, 'product_uom_qty': 5}),
            (0, 0, {'product_id': 5, 'product_uom_qty': 69})
        ]
        
        newlist = [i for i in bigdumblist if i[2]['product_id'] not in [2,3]]
        

        【讨论】:

          【解决方案5】:

          列表理解是一种方法。

          你可能想要类似的东西:

          filtered_list = [item for item in original_list if item["product_id"] in (2, 3)]
          

          另一个选项是filter:

          def valid_products(item):
              return item["product_id"] in (2,3)
          
          filtered_list = list(filter(valid_products, original_list))
          

          【讨论】:

            【解决方案6】:
            items = [item for item in bigdumblist if item item[2]['product_id'] in (2,3)]
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-03-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-02-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多