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



我有一个列表:

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

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

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

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

[x表示bigdumplist中的x,如果[2,3]]中的x[2]['product_id']

对于这种过滤器,您应该真正使用列表理解,比如:

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]]

列表理解是实现这一点的一种方法。

你可能想要类似的东西:

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))
items = [item for item in bigdumblist if item item[2]['product_id'] in (2,3)]

最新更新