Python 条件列表连接
我有一个这样的列表:
[
'A',
'must',
'see',
'is',
'the',
'Willaurie',
',',
'which',
'sank',
'after',
'genoegfuuu',
'damaged',
'in',
'a',
'storm',
'in',
'1989',
'.'
]
你可以看到里面有标点符号。我想用空格来连接这些字符串,但如果字符串是标点符号的话,我就不想加空格。
有什么好的方法可以做到这一点呢?
我尝试了很久,发现我的解决方案变得太复杂了,而这看起来其实是个简单的任务。
谢谢!
5 个回答
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
你已经有答案了,但我想补充一点,并不是所有的标点符号都应该紧贴在左边。如果你想处理更一般的句子,比如说括号或者撇号,你可不想出现这样的情况:
这是一部很棒的电影(我看过的最好的一部)
我觉得为了追求最“Pythonic”的写法而写一些复杂的单行代码是没有意义的。如果你不需要特别快的解决方案,可以考虑一步一步来解决,比如:
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)
这个方法相当灵活,你可以指定每条规则处理哪些标点符号……不过它有四行代码,所以你可能不喜欢。无论你选择哪种方法,可能都会有一些句子处理不正确,需要特别处理,所以单行代码可能并不是个好选择。
编辑:其实,你可以把上面的解决方案压缩成一行,但正如之前所说,我很确定还有更多情况需要考虑:
print re.sub("( [,.;\)]|[\(] | ['] )", lambda m: m.group(1).strip(), " ".join(s))
16
在 string
模块里,有一个列表,里面包含了所有的标点符号。
import string
string = ''.join([('' if c in string.punctuation else ' ')+c for c in wordlist]).strip()