我有一个对象列表,我想从列表的开头开始,直到符合简单条件的第一个对象(如imp[1] == 'conversion'
列表中的某个元素时为imp
)
一种简单的方法是:初始化一个新列表,遍历原始列表,并在每一步追加当前元素并检查当前元素的条件。如果条件不满足则继续,如果满足则休息。
new_list = []
for ele in old_list:
new_list.append(ele)
if condish(ele):
break
但这在内存,运行时和代码(三巨头!)中似乎效率低下。
答案 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):
...
这可以避免构建一个您真正不需要/想要的列表,而是为您提供一个可迭代的列表。