慕桂英4014372
没有对其进行基准测试,但我会尝试fold。functools 模块提供了reduce 功能:>>> s = "are all levels lavendar lemon maverick king of gamblers" 在空格上拆分字符串:>>> t = s.split(" ")>>> t['are', 'all', 'levels', 'lavendar', 'lemon', 'maverick', 'king', 'of', 'gamblers']并折叠列表:>>> import functools>>> u = functools.reduce(lambda acc, x: acc[:-1] + [x+acc[-1]] if acc and x and acc[-1][-1] == x[0] else acc + [x], t, [])>>> u['are', 'lemonlavendarlevelsall', 'kingmaverick', 'of', 'gamblers']我们从一个空列表开始[]。有两种情况:如果前一个词(或压缩词)的最后一个字母是当前词的第一个字母(acc[-1][-1] == x[0]),那么我们在前一个词(或压缩词)之前插入当前词:acc[:-1] + [x+acc[-1]]。否则,我们将当前单词添加到列表中。现在只需打印结果:>>> print("\\n".join(u))arelemonlavendarlevelsallkingmaverickofgamblers另一个版本,基于观察如果我们有一个单词w[i]的最后一个字母c=w[i][-1]so w[i+1][0] = c,那么我们构建w[i+1]+w[i]并且最后一个字母将c再次出现:我们只需要检查下一个单词是否w[i+2], w[i+3], ...以cetc 开头。如果没有,开始一个新的线。s = "are all levels lavendar lemon maverick king of gamblers"t = s.split(" ")i = 0while i < len(t): c = t[i][-1] j = i+1 cur = [t[i]] while j<len(t) and t[j][0] == c: cur.insert(0, t[j]) j += 1 print("".join(cur)) i = j