2015-02-05 62 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

相關問題