我可能会使用generator expressions(对于lazy evaluation)写这样的东西:
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 空格)。
将其分解为其组成部分(使用list comprehensions 进行说明):
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
结论
通过遵守The Zen of Python 优化可读性和可维护性,您的代码将“更加pythonic”。