Python условный список присоединяется - PullRequest
9 голосов
/ 02 августа 2011

У меня есть список, который выглядит следующим образом:

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

Как видите, есть пунктуация.Я хочу вызвать .join, используя пробел, за исключением случаев, когда строка является пунктуацией, тогда я не хочу разделитель.

Какой лучший способ сделать это?
У меня естьнекоторое время пытался, и мои решения становятся слишком сложными для того, что кажется простой задачей.

Спасибо

Ответы [ 5 ]

12 голосов
/ 02 августа 2011

Модуль string содержит список, содержащий все знаки пунктуации.

import string
string = ''.join([('' if c in string.punctuation else ' ')+c for c in wordlist]).strip()
4 голосов
/ 02 августа 2011

У вас уже есть свой ответ, но я хотел бы добавить, что не все знаки препинания должны быть прикреплены к левой стороне. Если вы хотите иметь дело с более общими предложениями, у вас могут быть, например, круглые скобки или апострофы, и вы не захотите получить что-то вроде:

Это отличный фильм (лучшее, что я видел)

Я бы сказал, что бессмысленно создавать какие-то неприятные однострочники, просто делать это самым питонским способом. Если вам не нужно сверхбыстрое решение, вы можете рассмотреть его пошаговое решение, например:

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))
3 голосов
/ 02 августа 2011
>>> ''.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.'
1 голос
/ 02 августа 2011

Как насчет использования фильтра?

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))
1 голос
/ 02 августа 2011

Вроде так

re.sub(r'\s+(?=\W)', '', ' '.join(['A', 'must', 'see', 'is', 'the', 'Willaurie', ',', 'which', 'sank', 'after', 'genoegfuuu', 'damaged', 'in', 'a', 'storm', 'in', '1989', '.']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...