2014-10-16 145 views
0

我有以下列表:用python刪除列表中的特定字符串元素?

L = [('carga', 'NCFS000', 'superior', 'AQ0CS0'),('carga', 'NCFS000', 'frontal', 'AQ0CS0')] 

如何刪除'NCFS000', 'AQ0CS0'的方括號?是這樣的:

[('carga', 'superior'),('carga', 'frontal')] 

這是我所有準備嘗試:

def remove_values_from_list(the_list, val): 
    return [value for value in the_list if value != val] 

print "Esta es el bigrama final:\n",\ 
    remove_values_from_list(L, 'NCFS000') 

但是id仍然在列表中,我如何刪除id並獲取所需格式的所有單詞?我怎樣才能爲這個任務聲明一個正則表達式?由於

+0

我該如何「爲這個任務申報一個正則表達式」是完全錯誤的要求。處理已經被分析成好數據結構的數據比將該數據結構轉換爲字符串並嘗試將其轉換成可以解析回不同數據結構的東西要容易得多。 – abarnert 2014-10-16 18:48:29

+0

所以,使用一個正則表達式的數據結構更有效率? – 2014-10-16 19:00:35

+0

首先,「更高效」幾乎總是完全不相關的;如果它們都是線性時間的,這不是瓶頸,誰在乎哪一個更快?但是,在極少數情況下,使用已有的數據結構通常比用字符串表示字符串,使用正則表達式和重新解析它更有效。更重要的是,對於需要處理代碼的您和其他人來說,閱讀,理解,擴展和調試幾乎肯定會更容易。 – abarnert 2014-10-16 19:33:49

回答

1

您可以使用list comprehensionslicing

>>> L = [('carga', 'NCFS000', 'superior', 'AQ0CS0'),('carga', 'NCFS000', 'frontal', 'AQ0CS0')] 
>>> [x[::2] for x in L] 
[('carga', 'superior'), ('carga', 'frontal')] 
>>> 
+1

只有在不需要的項目的位置是固定的時候纔有效,而不是如果您想按值刪除項目。 – greschd 2014-10-16 21:22:22

0

這裏的問題是,你有一個嵌套的集合,而不是一個嵌套循環。頂級列表沒有任何值== 'NCFS000',因此在刪除所有這些值之後,沒有任何更改。

你想要的是:對於列表中的每個元組,刪除每個值== 'NCFS000',對吧?你有兩個「each」es,所以你需要在你的代碼中有兩個for

def remove_values_from_list(the_list, val): 
    return [[value for value in the_sublist if value != val] 
      for the_sublist in the_list] 

當然這會給你一個列表列表,而不是你開始的元組列表。如果這是一個問題,Python沒有一個「元組的理解」,但它確實是,tuple構造和生成器表達式,這是不夠好:

def remove_values_from_list(the_list, val): 
    return [tuple(value for value in the_sublist if value != val) 
      for the_sublist in the_list] 
0

你只遍歷元組,而不是價值本身。如果你想一次刪除多個值,你可以做這樣的:

L = [('carga', 'NCFS000', 'superior', 'AQ0CS0'),('carga', 'NCFS000', 'frontal', 'AQ0CS0')] 

def remove_values_from_list(the_list, val):  
    return [tuple(value for value in inner_list if value not in val) for inner_list in the_list] 

print "Esta es el bigrama final:\n",\ 
    remove_values_from_list(L, ['NCFS000','AQ0CS0']) 
0

在給定的value != va你的代碼進行比較'NCFS000'('carga', 'NCFS000', 'superior', 'AQ0CS0')例如,沒有給予期望的結果。你需要有一個嵌套的列表理解。

基於正則表達式

import re 
def remove_values_from_list(the_list, regex): 
    return [tuple(val for val in value if re.match(regex, val)) for value in the_list] 
print remove_values_from_list(L, r'^[a-z]+$') 

我不能發表評論,該代碼過濾器,所以我要在這裏做到這一點... 我的正則表達式的用途是不一樣的東西abarnert的想法。他認爲將數據結構轉換爲字符串,然後在其上運行正則表達式。正如他所說,這將是荒謬的。但是我正在對數據結構中的字符串運行一個正則表達式。這我覺得我們都可以同意是好的。

0

您可以通過以下項目組成的功能:

L = [('carga', 'NCFS000', 'superior', 'AQ0CS0'),('carga', 'NCFS000', 'frontal', 'AQ0CS0')] 
r = frozenset(['NCFS000', 'AQ0CS0']) 
result = [filter(lambda i: i not in r, t) for t in L] 

,結果是你期望的。

相關問題