2014-02-16 35 views
1

我一直在試圖找到一些已完成我想做的事情,但我找不到任何東西。查找並從列表中刪除列表

我有這個名單,即

rows = 
[['Jan 31', ' 2014 19:48:30.096606000', '0x10', '0x00000000', '0x0f7864ef', '0x0f7864f1', '', 'blahblah', 'other \n'], 
['Jan 31', ' 2014 19:48:30.829329000', '0x10', '0x00000000', '0x0f920978', '0x0f92097a', '', 'blahblah', 'anotherr \n']] 

我需要找到並通過這樣的第五項從列表中刪除搜索列表:

search == '0x0f7864ef' 
if any(e[4] == search for e in rows): 

如果搜索存在變種那麼我得到一個真實的,但我不知道如何從「行」中刪除它。並做類似rows.remove(e)只是返回一個錯誤

我已經嘗試循環一個集合和刪除時發現,但我得到一個錯誤。另外,我寧願不必循環遍歷集合/列表。這是我的嘗試:

>>> a = {('1','da','vi'), (2,'be','vi') } 
>>> for item in a: 
... if 'da' in item: 
...  a.remove(item) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
RuntimeError: Set changed size during iteration 
>>> a 
set([(2, 'be', 'vi')]) 

即使該項目已被刪除,我得到了一個錯誤......

謝謝!

回答

0

您不應該在迭代列表中插入/移除列表中的元素。 相反,您可以使用更高階的函數,如filter

在Python 2.7:

>>> filter(lambda e: e[4] != '0x0f7864ef', rows) 
[['Jan 31', 
    ' 2014 19:48:30.829329000', 
    '0x10', 
    '0x00000000', 
    '0x0f920978', 
    '0x0f92097a', 
    '', 
    'blahblah', 
    'anotherr \n']] 

在Python 3.X(filter回報發電機):

>>> filter(lambda e: e[4] != '0x0f7864ef', rows) 
<builtins.filter at 0x7f76e2432810> 

>>> list(filter(lambda e: e[4] != '0x0f7864ef', rows)) 
[['Jan 31', 
    ' 2014 19:48:30.829329000', 
    '0x10', 
    '0x00000000', 
    '0x0f920978', 
    '0x0f92097a', 
    '', 
    'blahblah', 
    'anotherr \n']] 

爲了可讀性起見,您可能希望定義一個名爲函數,而不是使用拉姆達。

+0

你好,謝謝你的回答。使用lamda就會返回列表*不匹配,並且圍繞它的其他戰爭將返回匹配行。如果我的列表非常大,創建一個過濾出匹配ID的新列表,如果我在列表中有成千上萬的項目,這會非常聰明嗎?我首先需要獲取匹配的項目並將其保存到某個位置(文件),然後再次執行它以過濾OUT項目,將列表存儲在不同的var中,然後再將其複製到原始var,然後全部完成再次爲下一個價值...你覺得呢? –

+0

我不確定我是否理解完整的問題。我認爲你只需要刪除特定位置的元素,以匹配條件。 –

+0

這是指向正確方向的答案。我所做的是過濾和過濾。我過濾進行匹配,並過濾掉匹配。謝謝@nadir! –

3

只需創建一個新的列表與過濾項目,像這樣:

new_list = [item for item in rows if search not in item] 

這是一個列表理解,這是評價一個列表中的表達式。上面寫的時間越長的方式是在爲+如果循環,就像這樣:

new_list = [] 
for item in rows: 
    if search not in item: 
     new_list.append(item) 

這是一個實踐非常差將修改你的遍歷一個列表,這就是爲什麼標準的做法是創建一個新名單;無論是列表理解還是更傳統的循環。

+0

您好!感謝您的回答。我寧願不創建新的列表,因爲我會做很多。這是非常大的文件,其中包含我想匹配的REQUEST-RESPONSE日誌。當我看到一個新的請求時,我將它添加到列表中,當我得到響應時,我需要查找相應的請求並將它從列表中刪除。 REQUEST-REPONSES總計有數百萬(約3百萬),所以如果我不刪除已經匹配的請求,這個列表將會變得越來越大。你怎麼看? –

+0

使用'set',這會加快查找速度;無論你做什麼,都不要修改循環內的列表。 –

+0

是否有任何特定的原因維護列表超過設置?正如Burhan所說,set會加快查找速度,因爲Set lookup是O(1)就像字典一樣,您可以使用set.remove或set.pop輕鬆移除。 –