2015-02-05 99 views
0

我有一个对象列表,并且我希望将列表的开头直到满足简单条件的第一个对象(如imp[1] == 'conversion'imp为列表中的一些元素)。查找列表中的前N个元素,直到满足条件为止

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

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

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

回答

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)) 
+2

看起来你忘了你的'enumerate' – mgilson 2015-02-05 21:07:39

+0

@mgilson的详细信息.... :) ty – 2015-02-05 21:10:48

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): 
    ... 

这避免了构建一个你并不真正需要/需要的列表,而是给你一个迭代器。

+0

@iCodez - 对,这就是为什么我说“如果你想要更多的灵活性和控制(...),它可能值得考虑一个发电机功能“ – mgilson 2015-02-05 21:08:22

相关问题