选择满足条件的元素

时间:2014-11-20 12:51:44

标签: python performance list python-3.x

我想从(非常长)列表中选择满足条件的特定元素。在我的特定情况下,列表中的每个项目都是一个类,我想要的条件是,例如,item.id == 1.

我从

开始
[item for item in collection if item.id == 1]

但我不想遍历整个列表,因为我确信只有一个元素符合条件。

另一个选项是

def check(collection):
    for item in collection:
        if item.id == 1:
            return item

有更有效的方法吗? Python 3是否具有内置功能? 另一种选择可以是预处理列表以获得字典,例如

{item.id : item for item in collection}

2 个答案:

答案 0 :(得分:6)

您可以使用generator expressionnext() function

item = next((item for item in collection if item.id == 1), None)

这将在集合中找到第一个匹配元素,如果没有匹配则返回None。它不会迭代和评估任何超过查找一个元素的严格要求。

但是,如果你确实需要这么做,只需创建一次映射,然后查询每次都会更有效:

mapping = {item.id: item for item in collection}
item = mapping.get(1)

因为它将循环限制为仅一次,然后使用O(1)查找性能。这是一种记忆与速度的权衡。

答案 1 :(得分:1)

要获得满足条件的第一个元素,请使用the ninja's answer中列出的next()

要获得满足条件的元素并检查它是否是唯一的,我使用以下函数:

def single(seq):
    """Checks that the sequence has a single element and returns it."""
    """Analogous to .Net LINQ's Single()"""
    if hasattr(seq,"__len__"):
        assert len(seq)==1
        return seq[0]
    else:
        i=iter(seq)
        try: value=i.next()
        except StopIteration: raise AssertionError()
        try: i.next()
        except StopIteration: return value
        else: raise AssertionError()