【问题标题】:Delete specific string elements of a list with python?用python删除列表的特定字符串元素?
【发布时间】:2014-10-16 18:41:31
【问题描述】:

我有以下清单:

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 并以所需格式获取所有单词?我如何为这个任务声明一个正则表达式?谢谢

【问题讨论】:

  • 我怎样才能“为这个任务声明一个正则表达式”是完全错误的问题。处理已解析为良好数据结构的数据几乎总是比将该数据结构转换为字符串并尝试将其正则表达式转换为可以解析回不同数据结构的东西更容易。
  • 那么,使用嵌入正则表达式的数据结构更有效吗?
  • 首先,“更高效”几乎总是完全无关紧要;如果它们都是线性时间,而且这不是瓶颈,谁在乎哪个更快?但是,是的,在少数重要的情况下,使用您已经拥有的数据结构通常比将其表示为字符串、使用正则表达式并重新解析它更有效。更重要的是,对于您和其他必须处理您的代码的人来说,它几乎肯定会更容易阅读、理解、扩展和调试。

标签: python regex list parsing sorting


【解决方案1】:

您可以使用list comprehensionslicing

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

【讨论】:

  • 只有在不需要的项目的位置是固定的情况下才有效,而不是如果你想按值删除项目。
【解决方案2】:

这里的问题是您有一个嵌套集合,但没有嵌套循环。顶级列表没有任何值== 'NCFS000',所以在删除所有这些值之后,什么都没有改变。

你想要的是:对于列表中的每个元组,删除每个值== 'NCFS000',对吗?你有两个“每个”,所以你的代码中需要两个 fors。

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]

【讨论】:

    【解决方案3】:

    您只是在迭代元组,而不是值本身。如果你想一次删除多个值,你可以这样做:

    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'])
    

    【讨论】:

      【解决方案4】:

      您可以通过以下项目组成您的函数:

      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]
      

      ,结果如你所愿。

      【讨论】:

        【解决方案5】:

        例如,在您的代码中,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]+$')
        

        我不能发布 cmets,所以我必须在这里做这个...... 我对正则表达式的使用与 abarnert 的想法不同。他想把数据结构变成一个字符串,然后在上面运行一个正则表达式。正如他所说,那将是荒谬的。但我正在数据结构中的字符串上运行正则表达式。我认为我们都可以同意这一点很好。

        【讨论】:

          猜你喜欢
          • 2020-04-05
          • 1970-01-01
          • 2020-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-07
          • 2018-09-08
          • 2021-10-02
          相关资源
          最近更新 更多