gpt4 book ai didi

python - 使用列表推导式在列表中查找 1 个元素?

转载 作者:太空宇宙 更新时间:2023-11-04 09:32:54 25 4
gpt4 key购买 nike

我有一个关于 Python 最佳实践的快速问题。我已经看到 lambda + 过滤器函数用于列表理解的地方,但我想知道是否有更简单的方法来查找列表中的特定元素,而无需在整个列表中生成和迭代。

使用 AWS boto3 库,我通过列表理解查询各种 get_x() 函数:

[i['domainName'] for i in domain_names['items'] if re.search(r'\b'+domain_name, i['domainName'])].pop()

[i['id'] for i in usage_plans['items'] if i['name']==f'{self.service}Usage'].pop()

如果没有找到项目,将捕获一个 IndexError 并将其转发回给用户。由于这是在 AWS Lambda 函数中,我担心该函数的可扩展性和运行时计费。

我应该继续使用列表推导式吗?还是有更好的方法?

最佳答案

如果您想避免遍历整个列表,您可以使用生成器理解而不是列表理解。例如:

next(i for i in range(0, 2**1000) if i % 2 == 1)

迭代整个范围需要一段时间,但使用生成器理解它是瞬时的。

请注意,如果它没有找到一个项目,您将得到一个 StopIteration 异常而不是 IndexError。您真的必须捕获它并将其包装在另一个异常中,因为通过堆栈传播的杂散 StopIteration 可能会导致奇怪的行为。

包装 StopIteration 如下所示:

>>> try:
... next(i for i in range(0, 100) if i % 2 == 3 )
... except StopIteration:
... raise IndexError("Couldn't find item")
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
StopIteration

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "<stdin>", line 4, in <module>
IndexError: Couldn't find item

请注意,您可以为 next 提供一个默认值以返回,而不是引发 StopIteration:

>>> print(next((i for i in range(0, 100) if i % 2 == 3), None))
None

关于python - 使用列表推导式在列表中查找 1 个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55004849/

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