【问题标题】:Python conditional list joinsPython 条件列表连接
【发布时间】:2011-08-01 23:25:22
【问题描述】:

我有一个如下所示的列表:

[
  'A',
  'must',
  'see',
  'is',
  'the',
  'Willaurie',
  ',',
  'which',
  'sank',
  'after', 
  'genoegfuuu',
  'damaged',
  'in',
  'a',
  'storm',
  'in',
  '1989',
  '.'
]

如您所见,有标点符号。我想使用空格调用.join,除非字符串是标点符号,然后我不想要分隔符。

最好的方法是什么?
我已经尝试了一段时间,但对于看似简单的任务来说,我的解决方案变得过于复杂。

谢谢

【问题讨论】:

    标签: python string list


    【解决方案1】:

    string 模块有一个包含所有标点符号的列表。

    import string
    string = ''.join([('' if c in string.punctuation else ' ')+c for c in wordlist]).strip()
    

    【讨论】:

    • 刚导入同名模块后最好不要命名变量“string”。在这段代码之后,“string”应该是一个str类型的变量,而不是模块,这可能会使没有经验的人感到困惑。
    【解决方案2】:

    您已经有了答案,但只是想补充一点,并非所有标点符号都应该放在左侧。如果您想处理更一般的句子,您可以使用例如括号或撇号,并且您不想以以下结尾:

    这是一部很棒的电影(我看过的最好的)

    我想说创建一些讨厌的单线是没有意义的,只是以大多数 Python 的方式来做到这一点。如果不需要超快的解决方案,可以考虑一步步解决,例如:

    import re
    s = ['It', "'", 's', 'a', 'great', 'movie', 
         '(', 'best', 'I', "'", 've', 'seen', ')']
    
    s = " ".join(s) # join normally
    s = re.sub(" ([,.;\)])", lambda m: m.group(1), s) # stick to left
    s = re.sub("([\(]) ", lambda m: m.group(1), s)    # stick to right
    s = re.sub(" ([']) ", lambda m: m.group(1), s)    # join both sides
    
    print s # It's a great movie (best I've seen)
    

    它非常灵活,您可以指定每条规则处理的标点符号...虽然它有 4 行,所以您可能不喜欢它。无论你选择哪种方法,都可能有一些句子不能正常工作并需要特殊情况,所以无论如何单行可能只是一个糟糕的选择。

    编辑:实际上,您可以将上述解决方案简化为一行,但如前所述,我很确定还有更多情况需要考虑:

    print re.sub("( [,.;\)]|[\(] | ['] )", lambda m: m.group(1).strip(), " ".join(s))
    

    【讨论】:

    • 确实,有很多极端情况。我是通过使用 NLTK 来标记我的文本而不注意单词标记器而陷入这种情况的。现在很乱。感谢您的回复。
    【解决方案3】:
    >>> ''.join([('' if i in set(",.!?") else ' ') + i for i in words]).strip()
    'A must see is the Willaurie, which sank after genoegfuuu damaged in a storm in 1989.'
    

    【讨论】:

      【解决方案4】:

      像这样

      re.sub(r'\s+(?=\W)', '', ' '.join(['A', 'must', 'see', 'is', 'the', 'Willaurie', ',', 'which', 'sank', 'after', 'genoegfuuu', 'damaged', 'in', 'a', 'storm', 'in', '1989', '.']))
      

      【讨论】:

        【解决方案5】:

        使用过滤器怎么样?

        words = ['A', 'must', 'see', 'is', 'the', 'Willaurie', ',', 'which', 'sank', 'after', 'genoegfuuu', 'damaged', 'in', 'a', 'storm', 'in', '1989', '.']
        ' '.join(filter(lambda x: x not in string.punctuation, words))
        

        【讨论】:

        • 这并不能回答问题——它完全删除了标点符号。
        猜你喜欢
        • 2021-09-10
        • 2021-06-11
        • 1970-01-01
        • 2023-04-07
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 1970-01-01
        相关资源
        最近更新 更多