2014-10-16 114 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] 

,结果是你期望的。

相关问题