当前位置: 首页 > 面试题库 >

Python-从符合条件的可迭代项中获取第一项

宦高岑
2023-03-14
问题内容

我想从符合条件的列表中获得第一项。重要的是,生成的方法不能处理整个列表,这可能会很大。例如,以下功能是足够的:

def first(the_iterable, condition = lambda x: True):
    for i in the_iterable:
        if condition(i):
            return i

可以使用以下功能:

>>> first(range(10))
0
>>> first(range(10), lambda i: i > 3)
4

但是,我想不出一个好的内置式/单层式来让我做到这一点。如果不需要,我特别不想复制此功能。是否有内置的方法来获取与条件匹配的第一项?


问题答案:

在Python 2.6或更高版本中:

如果StopIteration在找不到匹配元素的情况下希望被引发:

next(x for x in the_iterable if x > 3)

如果你希望返回default_value(例如None),请执行以下操作:

next( (x for x in the_iterable if x>3), default_value)

请注意,在这种情况下,你需要在生成器表达式周围加一对括号-当生成器表达式不是唯一的参数时,总是需要它们。

我看到大多数答案都坚决地忽略了next内置函数,因此我认为出于某种神秘的原因,它们100%专注于2.5版及更早的版本-并未提及Python版本问题(但后来我没有看到该提及确实提到next内置答案的原因,这就是为什么我认为有必要自己提供答案的原因-至少以这种方式记录“正确版本”问题;-)。

在2.5中,如果迭代器立即完成.next(),则迭代器的方法立即提高StopIteration-即,对于你的用例,如果可迭代项中没有项满足条件。如果你不在乎(即,你知道必须至少有一个令人满意的项目),则只需使用.next()(在genexp上最好next,Python 2.6内置的行及更高版本)。

如果你确实愿意的话,按照你在Q中首先指出的方法将内容包装在函数中似乎是最好的,虽然你建议的函数实现很好,但是你也可以使用itertools,for...: break循环genexp,或者将a try/except StopIteration作为函数的主体,如各种答案所示。这些替代方案都没有太多附加值,因此我会选择你最初提出的简洁的版本。



 类似资料:
  • 问题内容: 如何获取与流中的条件匹配的第一个元素?我已经尝试过了但是没用 该条件不起作用,在除Stop之外的其他类中调用filter方法。 问题答案: 这可能是您要寻找的: 一个例子: 输出为:

  • 问题内容: 如果我有一个收藏,例如,我如何拿出第一件?我可以先叫一个,先取一个,然后扔掉。有没有更浪费的方法呢? 问题答案: Iterables.get(yourC,indexYouWant) 因为实际上,如果您使用的是收藏夹,则应该使用Google收藏夹。

  • 问题内容: 我有一个功能。,它接受一个整数并返回True或False。 我有10个整数的列表。我想返回列表中的第一个项目(与原始列表的顺序相同),该项目已返回True。 尽可能地Python。 问题答案: next(x for x in lst if matchCondition(x)) 应该可以,但是如果列表中的所有元素都不匹配,它将提高。您可以通过提供第二个参数来抑制这种情况: 如果没有匹配项

  • 问题内容: 从Python 2.6的迭代器中获取最后一项的最佳方法是什么?例如说 从中获取最短代码/最干净的方法是什么? 我可以这样做,但是效率似乎不高: 问题答案:

  • 我已经成功地从API中检索了工作项。我还可以从API中检索迭代/团队/项目等。我的问题是我有工作项对象,我想引用到迭代/团队/项目。我还没有找到从工作项的现有信息中检索此信息的方法。似乎迭代路径并不总是与真正的迭代相关???工作项中是否有我可以用来引用项目/团队/迭代的字段。 https://docs.microsoft.com/en-us/rest/api/azure/devops/work/i

  • 问题内容: 我目前面临的问题是我有一个字符串,我只想提取第一个数字。我的第一步是从字符串中提取数字。 在这种情况下,它向我返回了两个数字,但我只想拥有第一个数字“ 27184”。 因此,我尝试使用以下代码: 但这不起作用: 你们可以帮我吗?任何反馈表示赞赏 问题答案: 只需使用它在找到匹配项后就停止匹配。 要么 您必须删除正则表达式中存在的正斜杠。