Я бы, вероятно, написал что-то подобное, используя выражения генератора (для ленивая оценка):
def reverse_sentences(text):
sentences = text.split('.')
reversed_words = (reversed(words.split()) for words in sentences)
rejoined_words = (' '.join(words) for words in reversed_words)
capitalized_sentences = (sentence.capitalize() for sentence in rejoined_words)
return '. '.join(capitalized_sentences)
reverse_sentences("One two three. Four five six.")
Я предпочитаю эту функцию «однострочной», поскольку ее легче поддерживать (например, если вы хотите добавить обработку пунктуации или strip
-ping пробел).
Разбивая это на составные части (используя списковые включения для иллюстрация):
In [1]: text = "One two three. Four five six."
In [2]: text
Out[2]: 'One two three. Four five six.'
In [3]: sentences = text.split('.')
In [4]: sentences
Out[4]: ['One two three', ' Four five six', '']
In [5]: reversed_words = [words.split()[::-1] for words in sentences]
In [6]: reversed_words
Out[6]: [['three', 'two', 'One'], ['six', 'five', 'Four'], []]
In [7]: rejoined_words= [' '.join(words) for words in reversed_words]
In [8]: rejoined_words
Out[8]: ['three two One', 'six five Four', '']
In [9]: capitalized_sentences = [sentence.capitalize() for sentence in rejoined_words]
In [10]: capitalized_sentences
Out[10]: ['Three two one', 'Six five four', '']
In [11]: '. '.join(capitalized_sentences)
Out[11]: 'Three two one. Six five four. '
Примечание:
Скорость
Вы, наверное, хотите знать, насколько быстро это работает...
Здесь пригодится timeit
.
> python -m timeit <<EOF
def reverse_sentences(str):
newlist=str.split(".")
newstr=''
for s in newlist[0:-1]:
words=s.split()
words=words[::-1]
words[0]=words[0][0].upper()+words[0][1:]
words[-1]=words[-1][0].lower()+words[-1][1:]
for e in range(len(words)):
words[e].strip()
if words[e] != words[-1]:
newstr+=words[e]+" "
else:
newstr+=words[e]
newstr+=". "
return newstr
reverse_sentences("One two three. Four five six.")
EOF
100000000 loops, best of 3: 0.012 usec per loop
> python -m timeit <<EOF
def reverse_sentences(text):
sentences = text.split('.')
reversed_words = (reversed(words.split()) for words in sentences)
rejoined_words = (' '.join(words) for words in reversed_words)
capitalized_sentences = (sentence.capitalize() for sentence in rejoined_words)
return '. '.join(capitalized_sentences)
reverse_sentences("One two three. Four five six.")
EOF
100000000 loops, best of 3: 0.012 usec per loop
> python -m timeit <<EOF
t="One two three. Four five six."
' '.join(' '.join(sentence.lower().split()[::-1]).capitalize()+'.' for sentence in t.split('.')[:-1])
EOF
100000000 loops, best of 3: 0.012 usec per loop
Вывод
Оптимизируйте для удобства чтения и сопровождения, придерживаясь Дзен Python и своего кода. будет "более питоническим".
person
Johnsyweb
schedule
01.03.2014
One, two three.
? Как вы относитесь к,
? - person zhangxaochen   schedule 01.03.2014