【问题标题】:python: keep char only if it is within this listpython:仅当它在此列表中时才保留字符
【发布时间】:2010-08-27 22:07:01
【问题描述】:

我有一个清单:

a = ['a','b','c'.........'A','B','C'.........'Z']

我有字符串:

string1= 's#$%ERGdfhliisgdfjkskjdfW$JWLI3590823r'

我只想保留string1 中存在于a 中的那些字符

最有效的方法是什么?也许不是让a 成为一个列表,我应该把它变成一个字符串?像这样a='abcdefg..........ABC..Z' ??

【问题讨论】:

    标签: python list string


    【解决方案1】:

    这应该更快。

    >>> import re
    >>> string1 = 's#$%ERGdfhliisgdfjkskjdfW$JWLI3590823r'
    >>> a = ['E', 'i', 'W']
    >>> r = re.compile('[^%s]+' % ''.join(a))
    >>> print r.sub('', string1)
    EiiWW
    

    这比那更快。

    >>> all_else = ''.join( chr(i) for i in range(256) if chr(i) not in set(a) )
    >>> string1.translate(None, all_else)
    'EiiWW'
    

    44 微秒与我的笔记本电脑上的 13 微秒。

    怎么样?

    (编辑:原来,翻译产生最好的性能。)

    【讨论】:

      【解决方案2】:
      ''.join([s for s in string1 if s in a])
      

      解释

      [s for s in string1 if s in a]
      

      创建 string1 中所有字符的列表,但前提是它们也在列表 a 中。

      ''.join([...])
      

      通过在给定列表的元素之间加入空白 ('') 将其转回字符串。

      【讨论】:

      • @I__ 你应该知道,如果a 足够大,这会明显变慢。您应该将其设置为一组或使用我介绍的re 方法。如果a 很大,re 方法通常是最快的。
      • 这真是……太棒了! :D
      【解决方案3】:

      List comprehension 来救援!

      wanted = ''.join(letter for letter in string1 if letter in a)
      

      (请注意,将列表推导传递给函数时,您可以省略括号,以便在评估之前不会生成完整列表。虽然在语义上与列表推导相同,但这称为generator expression。 )

      【讨论】:

      • 如果省略方括号,它是一个生成器表达式。所以你应该链接到生成器表达式。
      【解决方案4】:

      如果您要使用大字符串执行此操作,使用translate 有一个更快的解决方案;见this answer

      【讨论】:

        【解决方案5】:

        @katrielalex:拼出来:

        import string 
        string1= 's#$%ERGdfhliisgdfjkskjdfW$JWLI3590823r'
        
        non_letters= ''.join(chr(i) for i in range(256) if chr(i) not in string.letters)
        print string1.translate(None,non_letters)
        
        print 'Simpler, but possibly less correct'
        print string1.translate(None, string.punctuation+string.digits+string.whitespace)
        

        【讨论】:

          猜你喜欢
          • 2017-04-20
          • 2017-08-02
          • 1970-01-01
          • 2023-02-09
          • 1970-01-01
          • 1970-01-01
          • 2021-01-24
          • 1970-01-01
          • 2018-01-30
          相关资源
          最近更新 更多