gpt4 book ai didi

python - 使用元组过滤和拆包处理空情况

转载 作者:太空狗 更新时间:2023-10-30 00:01:44 26 4
gpt4 key购买 nike

我有一些并行列表需要根据其中一个列表中的值进行过滤。有时我会写这样的东西来过滤它们:

lista = [1, 2, 3]
listb = [7, 8, 9]
filtered_a, filtered_b = zip(*[(a, b) for (a, b) in zip(lista, listb) if a < 3])

这给出了 filtered_a == (1, 2)filtered_b == (7, 8)

但是,将最终条件从 a < 3 更改为至 a < 0引发异常:

Traceback (most recent call last):
...
ValueError: need more than 0 values to unpack

我知道为什么会这样:列表理解是空的,所以就像调用 zip(*[]) ,类似于 zip() ,它只返回一个空列表,该列表不能解压缩到单独的 filtered_a 和 filtered_b 迭代器中。

是否有更好的(更短、更简单、更 pythonic)处理空案例的过滤函数?在空的情况下,我希望 filtered_a 和 filtered_b 是空的可迭代对象,因此任何后续代码都可以保持不变。

最佳答案

您可以使用默认值简单地短路:

filtered_a, filtered_b = zip(*[(a, b) for a, b in zip(lista, listb) if a < 0]) or ([], [])
print(filtered_b, filtered_a)
# [] []

对于 Python 3,您需要在 zip 返回的迭代器上调用 list,以便第一个操作数可以被评估为空列表(不是迭代器) ,否则即使迭代器可能为空,也永远不会达到默认值,因为 bool(iter([]))True

关于python - 使用元组过滤和拆包处理空情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40468683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com