如何将下面的双字母组合成一个字符串?
_bigrams=['the school', 'school boy', 'boy is', 'is reading']
_split=(' '.join(_bigrams)).split()
_newstr=[]
_filter=[_newstr.append(x) for x in _split if x not in _newstr]
_newstr=' '.join(_newstr)
print _newstr
Output:'the school boy is reading'
....它是理想的输出但是由于我的数据量很大,这种方法太长而且效率不高。其次,该方法不支持最终字符串中的重复单词,即'the school boy is reading, is he?'
。在这种情况下,最终字符串中只允许其中一个'is'
。
有关如何使这项工作更好的任何建议?感谢。
答案 0 :(得分:2)
# Multi-for generator expression allows us to create a flat iterable of words
all_words = (word for bigram in _bigrams for word in bigram.split())
def no_runs_of_words(words):
"""Takes an iterable of words and returns one with any runs condensed."""
prev_word = None
for word in words:
if word != prev_word:
yield word
prev_word = word
final_string = ' '.join(no_runs_of_words(all_words))
这利用了生成器来懒惰地评估并且不会在内存中同时保留整个单词集,直到生成最后一个字符串。
答案 1 :(得分:2)
如果你真的想要一个oneliner,这样的东西可以工作:
' '.join(val.split()[0] for val in (_bigrams)) + ' ' + _bigrams[-1].split()[-1]
答案 2 :(得分:1)
会这样做吗?它只是将第一个单词带到最后一个条目
_bigrams=['the school', 'school boy', 'boy is', 'is reading']
clause = [a.split()[0] if a != _bigrams[-1] else a for a in _bigrams]
print ' '.join(clause)
输出
the school boy is reading
然而,关于性能可能Amber的解决方案是一个不错的选择