查找列表中的前N个元素,直到满足条件为止
问题描述:
我有一个对象列表,并且我希望将列表的开头直到满足简单条件的第一个对象(如imp[1] == 'conversion'
当imp
为列表中的一些元素)。查找列表中的前N个元素,直到满足条件为止
一个简单的方法是:初始化一个新列表,遍历原始列表,并在每一步追加当前元素并检查当前元素的条件。如果条件不满足,则继续,如果满足则中断。
new_list = []
for ele in old_list:
new_list.append(ele)
if condish(ele):
break
但是这在内存,运行时和代码(大三!)中似乎效率低下。
答
你可以试试这个:
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))
答
有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):
...
这避免了构建一个你并不真正需要/需要的列表,而是给你一个迭代器。
+0
@iCodez - 对,这就是为什么我说“如果你想要更多的灵活性和控制(...),它可能值得考虑一个发电机功能“ – mgilson 2015-02-05 21:08:22
看起来你忘了你的'enumerate' – mgilson 2015-02-05 21:07:39
@mgilson的详细信息.... :) ty – 2015-02-05 21:10:48