【发布时间】:2014-06-03 17:09:57
【问题描述】:
几天前我了解了列表推导,现在我觉得我对它们有点疯狂,试图让它们解决所有问题。也许我还没有真正理解它们,或者我对 Python 的了解还不够,无法让它们既强大又简单。这个问题已经困扰了我一段时间,如果有任何意见,我将不胜感激。
问题
在 Python 中,将字符串列表 words 加入到满足这些条件的单个字符串 excerpt 中:
- 单个空格分隔元素
-
excerpt的最终长度不超过整数maximum_length - 如果
words的所有元素都不在excerpt中,则将省略号字符…附加到excerpt - 只有
words的整个元素出现在excerpt中
丑陋的解决方案
words = ('Your mother was a hamster and your ' +
'father smelled of elderberries!').split()
maximum_length = 29
excerpt = ' '.join(words) if len(' '.join(words)) <= maximum_length else \
' '.join(words[:max([n for n in range(0, len(words)) if \
len(' '.join(words[:n]) + '\u2026') <= \
maximum_length])]) + '\u2026'
print(excerpt) # Your mother was a hamster…
print(len(excerpt)) # 26
是的,这行得通。 Your mother was a hamster and 适合 29,但没有为省略号留下空间。但是男孩是丑陋的。我可以稍微分解一下:
words = ('Your mother was a hamster and your ' +
'father smelled of elderberries!').split()
maximum_length = 29
excerpt = ' '.join(words)
if len(excerpt) > maximum_length:
maximum_words = max([n for n in range(0, len(words)) if \
len(' '.join(words[:n]) + '\u2026') <= \
maximum_length])
excerpt = ' '.join(words[:maximum_words]) + '\u2026'
print(excerpt) # 'Your mother was a hamster…'
但现在我创建了一个我永远不会再使用的变量。好像很浪费。而且它并没有真正让任何东西变得更漂亮或更容易理解。
有没有更好的方法来做到这一点,我只是还没有见过?
【问题讨论】:
-
看起来你对列表理解发疯是对的。记住python的禅:“3.简单胜于复杂”。我花了 10 秒来理解问题,但花了 5 分钟来理解你的代码。不要对线条和变量过于节俭。你需要打动的不是 python,而是稍后会维护你的代码的人。
-
如果我必须使用 listcomps 解决这个问题,我会使用
textwrap模块。 (但那不会使用 listcomps!--ed。仔细重读我的第一句话。--dsm) -
@DSM -
textwrap.shorten看起来完全符合我的要求,前提是words中的所有元素都不包含空格,在这种情况下,我可能会得到一个部分元素。不过,我没有在问题中具体说明这种可能性,因为我只是在阅读答案时才想到。