如何有条件地从列表中删除项目

时间:2020-08-17 21:21:19

标签: python

我有一个列表:

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})并不是解决方案。如何正确删除列表中的特定项目?

6 个答案:

答案 0 :(得分:2)

您可以像这样使用列表理解:

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

答案 1 :(得分:1)

遍历列表时,请勿修改列表。您可以先复制列表,但是使用列表理解会更简单。

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

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之类的逻辑运算符不会自动分布在关系运算符上。

答案 2 :(得分:0)

尝试像这样的条件列表理解...。

[如果在[2,3]中有x [2] ['product_id'],则在bigdumblist中将x用于x

答案 3 :(得分:0)

对于这种类型的过滤器,您应该真正使用列表推导,如下所示:

class="sr-only page-instructions"

答案 4 :(得分:0)

列表理解是做到这一点的一种方法。

您可能想要类似的东西:

const updateMaterials = async recipeRawMaterials => await Promise.all(
  recipeRawMaterials.map(({ _id, rate }, index) => updateRawMaterialsDB(_id, rate, index))
);

另一个选项是filter

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

答案 5 :(得分:-1)

items = [item for item in bigdumblist if item item[2]['product_id'] in (2,3)]
相关问题