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

2024-09-27 21:27:28 发布

您现在位置: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})并不是一个解决方案。如何正确删除列表中的特定项目


Tags: or项目inid列表ifisdef
3条回答

尝试这样的条件列表理解

如果[2,3]中的x[2]['product_id'],则在bigdumblist中的x代表x

您可以使用如下列表:

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

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

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

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

相关问题 更多 >

    热门问题