从python中给定的字符串列表中查找公共超弦

从python中给定的字符串列表中查找公共超弦,python,Python,我的输入中有我的字符串 'ATTAGACCTG', 'CCTGCCGGAA', 'AGACCTGCCG', 'GCCGGAATAC' 在输出中,我想要公共的最短超弦 ATTAGACCTGCCGGAATAC 我已经使用lambda表达式完成了它,但我希望它不使用lambda表达式 from itertools import * print min((reduce(lambda s,w:(w+s[max(i*(s[:i]==w[-i:])for i in range(99)):],s)[w in

我的输入中有我的字符串

'ATTAGACCTG', 'CCTGCCGGAA', 'AGACCTGCCG', 'GCCGGAATAC'
在输出中,我想要公共的最短超弦

ATTAGACCTGCCGGAATAC
我已经使用lambda表达式完成了它,但我希望它不使用lambda表达式

from itertools import *
print min((reduce(lambda s,w:(w+s[max(i*(s[:i]==w[-i:])for i in range(99)):],s)[w in s],p)
for p in permutations(input())),key=len)  
我在没有使用lambda表达式的情况下尝试了它,但得到了错误的输出

from itertools import permutations

def solve(*strings):
   """
   Given a list of strings, return the shortest string that contains them all.
   """
   return min((simplify(p) for p in permutations(strings)), key=len)

def prefixes(s):
   """
   Return a list of all the prefixes of the given string (including itself), in ascending order (from shortest to longest).
   """
   return [s[:i+1] for i in range(len(s))]
   return [(i,s[:i+1]) for i in range(len(s))][::-1]

def simplify(strings):
    """
    Given a list of strings, concatenate them wile removing overlaps between
    successive elements.
    """
    ret = ''
    for s in strings:
        if s in ret:
            break
        for i, prefix in reversed(list(enumerate(prefixes(s)))):
            if ret.endswith(prefix):
                ret += s[i+1:]
                break
        else:
            ret += s
    return ret

print solve('ATTAGACCTG', 'CCTGCCGGAA', 'AGACCTGCCG', 'GCCGGAATAC')  
我的输出错误:

ATTAGACCTGCCGGAA
看来

if s in ret:
    break
应该是

if s in ret:
    continue
我想那会解决的

另外,第二个return语句是多余的-它不是模拟了
反转(list(enumerate(前缀))


最后,我想我更喜欢您最初的map reduce解决方案

简单看一下,你就知道前缀中只有一个返回语句会起作用,对吧?你已经读过了吗?看起来你也在做DNA测序;)