Python 条件列表连接

13 投票
5 回答
16566 浏览
提问于 2025-04-16 22:41

我有一个这样的列表:

[
  '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()

撰写回答