【问题标题】:Filtering part of a list?过滤列表的一部分?
【发布时间】:2013-09-11 06:11:08
【问题描述】:

假设我要求输入并且用户输入:

"RED REDD REDDD REDDDDD"

我将字符串转换成一个列表,命名为redred[0] = 'RED', red[1] = 'REDD' 等等。

我怎样才能让它只显示字母D,并删除其他所有内容?那么red[0] 将是Dred[1] 将是DD 等等。有办法吗?谢谢

【问题讨论】:

    标签: python string list filtering


    【解决方案1】:

    我的解决方案可能看起来不如上面的解决方案可读性和直接性强,但它们展示了一些替代方法,这些方法可能会让您对自己想要做的事情产生不同的看法。至少,它们与使用正则表达式或列表推导的不同之处在于它们应该很好地处理大量输入,仅在您要求时生成您想要的组。

    itertools.groupby

    from itertools import groupby
    # Groups of adjacent letters 'D' and not 'D'
    g = groupby("RED REDD REDDD REDDDD", lambda c:c=='D')
    # Literally what you asked for:
    [''.join(i[1]) for i in g if i[0]]
    

    collections.Counter

    from collections import Counter
    words = "RED REDD REDDD REDDDD".split()
    # for large input: (i[itertools.groupby("RED REDD REDDD REDDDD", lambda c:c!=' '))
    counters = (Counter(w) for w in words)
    # Literally what you asked for:
    [c['D']*'D' for c in counters]
    

    【讨论】:

      【解决方案2】:

      您有很多选择,其中一些已经在其他答案中注明,还有这些:

      模式匹配的正则表达式

      import re
      s = "RED REDD REDDD REDDDDD"
      pattern = r'D+' 
      re.findall(pattern, s)
      

      字符串操作

      [''.join([c for c in x if c=='D']) for x in s.split()]
      

      【讨论】:

      • 如果s = "DREAD DREADD DREADDD DREADDDDD"怎么办?
      • 这个问题需要更好地说明,然后;在那种情况下,他没有说他想要什么,只是“它只显示字母 D”
      • 看看阿什维尼回答的 cmets
      • 我改变了理解,但我喜欢 Ashwini 对正则表达式的回答。
      【解决方案3】:

      您可以使用re.sub;将'D' 以外的所有内容替换为''

      >>> import re
      >>> strs = "RED REDD REDDD REDDDDD ABCDeeeeDDDDDDDD ABCD"
      >>> [re.sub(r'[^D]+', r'', item) for item in strs.split()]
      ['D', 'DD', 'DDD', 'DDDDD', 'DDDDDDDDD', 'D']
      

      或:

      >>> re.sub(r'[^D\s]+', r'', strs).split()
      ['D', 'DD', 'DDD', 'DDDDD', 'DDDDDDDDD', 'D']
      

      【讨论】:

      • 从看起来它似乎只过滤“RE”。如果用户输入 ABCDDDD,它必须能够删除“ABC”并且只打印出 D - 如果这有意义的话
      • @R337 对于ABCDeeeeDDDDDD 的预期输出?
      • ABCDeeeeDDDDDD 的预期输出为 DDDDDDD
      • @R337 澄清一下,您意识到有六个尾随Ds,而您的预期结果是 7?
      猜你喜欢
      • 2014-03-12
      • 1970-01-01
      • 2020-11-13
      • 2015-09-17
      • 2022-01-19
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      相关资源
      最近更新 更多