Python条件列表联接

2024-05-19 01:06:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表如下:

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

如你所见,这里有标点符号。我想使用空格调用.join,除了字符串是标点符号的情况外,那么我不需要分隔符。

最好的方法是什么?
我已经尝试了一段时间,我的解决方案变得太复杂了,似乎是一个简单的任务。

谢谢


Tags: theinwhich列表is空格see标点符号
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.'

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

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

你已经有你的答案了,但只是想补充一下,不是所有的标点符号都应该贴在左手边。如果你想处理更一般的句子,你可以有括号或撇号,你不想以这样的结尾:

It' s a great movie( best I' ve seen)

我想说,创建一个讨厌的一行是没有意义的,只是这样做最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))

相关问题 更多 >

    热门问题