找到列表的前N个元素,直到满足条件

时间:2015-02-05 21:00:27

标签: python list

我有一个对象列表,我想从列表的开头开始,直到符合简单条件的第一个对象(如imp[1] == 'conversion'列表中的某个元素时为imp

一种简单的方法是:初始化一个新列表,遍历原始列表,并在每一步追加当前元素并检查当前元素的条件。如果条件不满足则继续,如果满足则休息。

new_list = []
for ele in old_list:
    new_list.append(ele)
    if condish(ele):
        break

但这在内存,运行时和代码(三巨头!)中似乎效率低下。

2 个答案:

答案 0 :(得分:3)

你可以试试这个:

for idx, el in enumerate(your_list):
    if satisfies_condition(el):
        return your_list[:idx]

这将节省在内存中创建新列表的成本。

或者您可以使用itertools.takewhile

return list(itertools.takewhile(not_condition, your_list))

答案 1 :(得分:1)

itertools.takewhile应满足您的需求。当然,在这里你需要否定原始帖子中的条件,以便在满足条件时中断...

itertools.takewhile(lambda ele: not condish(ele), old_list)

如果你想要更多的灵活性和控制(例如你也想要第一个不符合条件的元素),可能值得考虑生成器函数:

def take_until(iterable):
    for item in iterable
        yield item
        if condition(item):
           return

然后你就像这样使用它:

for item in take_until(old_list):
    ...

这可以避免构建一个您真正不需要/想要的列表,而是为您提供一个可迭代的列表。