【问题标题】:How do I remove something form a list, plus string matching?如何从列表中删除某些内容以及字符串匹配?
【发布时间】:2010-12-19 19:27:09
【问题描述】:
[(',', 52),
 ('news', 15),
 ('.', 11),
 ('bbc', 8),
 ('and', 8),
 ('the', 8),
 (':', 6),
 ('music', 5),
 ('-', 5),
 ('blog', 4),
 ('world', 4),
 ('asia', 4),
 ('international', 4),
 ('on', 4),
 ('itunes', 4),
 ('online', 4),
 ('digital', 3)]

假设我有这个列表,里面有元组。

如何遍历列表并删除其中没有字母字符的元素?

所以变成这样:

[('news', 15),
 ('bbc', 8),
 ('and', 8),
 ('the', 8),
 ('music', 5),
 ('blog', 4),
 ('world', 4),
 ('asia', 4),
 ('international', 4),
 ('on', 4),
 ('itunes', 4),
 ('online', 4),
 ('digital', 3)]

【问题讨论】:

  • 需要澄清:(1)“字母”是否包括“_”? (2) 数字呢? “K9”、“R2D2”和“104.3FM”之类的“词”? (3) 你的意思是保留的元素应该全部是字母,还是你的意思是它们必须至少有一个字母字符?

标签: python regex list


【解决方案1】:
the_list = [(a, b) for a, b in the_list if a.isalpha()]

【讨论】:

  • 'a.'.isalpha() -> False,因此您的解决方案不正确。 any(c.isalpha() for c in a) 将完成这项工作。还是您有更好的解决方案?
  • 我认为给出的例子并没有扩展到所提出的问题。虽然问题本身听起来很明确,但我会说考虑到 OP 正在使用的上下文,这个问题很可能根本无法反映手头的任务。
【解决方案2】:

最简单的应该是带有正则表达式的列表推导:

import re

lst = [...]
lst = [t for t in lst if re.search(r'\w', t[0])]

【讨论】:

  • @SilentGhost:好的,\w 也可以匹配数字和下划线,但可以替换为[a-z] 或类似名称。除此之外,OP 要求删除“其中没有字母字符”的字符串。在我的解释中,这听起来像是他想要保留其中包含任何字母字符的所有内容。这就是我的解决方案所做的。您的删除了某处包含非 alpha 的所有内容。什么是“正确的”取决于真正应该完成的事情。
【解决方案3】:

@OP,只需逐个浏览列表项,并检查每个项的第一个元素。这只是我们简单而基本的思考过程。无需过多考虑是否是 Python 语言,或使用奇特的列表推导等。保持一切简单。

l = [(',', 52),
 ('news', 15),
 ('.', 11),
 ('bbc', 8),
 ('and', 8),
 ('the', 8),
 (':', 6),
 ('music', 5),
 ('-', 5),
 ('blog', 4),
 ('world', 4),
 ('asia', 4),
 ('international', 4),
 ('on', 4),
 ('itunes', 4),
 ('online', 4),
 ('digital', 3)]

for item in l:
    if item[0].isalpha():
        print item

输出

$ ./python.py
('news', 15)
('bbc', 8)
('and', 8)
('the', 8)
('music', 5)
('blog', 4)
('world', 4)
('asia', 4)
('international', 4)
('on', 4)
('itunes', 4)
('online', 4)
('digital', 3)

【讨论】:

    【解决方案4】:

    这使用string.ascii_letters,但SilentGhost's solution 是首选。

    >>> from string import ascii_letters
    >>> [(a, b) for a, b in l if all(c in ascii_letters for c in a)]
    [('news', 15), ('bbc', 8), ('and', 8), ('the', 8), ('music', 5), ('blog', 4), ('world', 4), ('asia', 4), ('international', 4), ('on', 4), ('itunes', 4), ('online', 4), ('digital', 3)]
    

    【讨论】:

      【解决方案5】:

      您也可以使用内置的 filter 功能,它实际上是专门用于此目的的。

      filter(lambda x:x[0].isalpha(),LIST)
      

      结果是这样的

      [('news', 15), 
      ('bbc', 8), 
      ('and', 8), 
      ('the', 8), 
      ('music', 5), 
      ('blog', 4), 
      ('world', 4), 
      ('asia', 4),
      ('international', 4), 
      ('on', 4), 
      ('itunes', 4), 
      ('online', 4), 
      ('digital', 3)]
      

      【讨论】:

      • 列表推导更 Pythonic。
      • 好吧,既然我知道已经有答案了,我为什么要复制那些?
      • S.Mark:filter() 内置函数可以被认为对于 Python 来说有些过时了。如今,列表推导式的使用频率要高得多。 (自推出以来,它们变得越来越流行;生成器表达式最终可能会慢慢流行起来)。
      • 好的,我个人也更喜欢使用列表理解。只是想证明,有内置函数。
      • 使用 filter() 没有任何问题。更蟒蛇?为何如此? filter() 是内置的,那么是什么让它不比其他的更 Pythonic 呢? Pythonic 的真正定义是什么? filter() 绝对不会过时,暂时不会。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2019-08-11
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多