Python查找列表的所有组合

Python查找列表的所有组合,python,for-loop,Python,For Loop,可能重复: 从头开始解决老问题。我把一切都弄明白了。现在我有一个更疯狂的问题。我应该得到以下信息: 输入:分数表([“a”、“s”、“m”、“t”、“p”]) 输出:['a',1],'am',4],'at',2],'spam',8]] 这个I/O工作得很好,但是如果我添加第6个元素,比如: 输入:分数表([“a”、“s”、“m”、“t”、“p”、“e”]) 这个程序疯狂地出错了。请告诉我如何解决这个问题。谢谢你的帮助 我的代码: from itertools import chain, com

可能重复:

从头开始解决老问题。我把一切都弄明白了。现在我有一个更疯狂的问题。我应该得到以下信息:

输入:分数表([“a”、“s”、“m”、“t”、“p”])

输出:['a',1],'am',4],'at',2],'spam',8]]

这个I/O工作得很好,但是如果我添加第6个元素,比如:

输入:分数表([“a”、“s”、“m”、“t”、“p”、“e”])

这个程序疯狂地出错了。请告诉我如何解决这个问题。谢谢你的帮助

我的代码:

from itertools import chain, combinations

def ind(e,L):
    if L==[] or L=="":
        return 0
    elif L[0]==e:
        return 0
    else:
        return ind(e,L[1:])+1

def letterScore(letter, scorelist):
    if scorelist[0][0] == letter:
        return scorelist[0][1]
    elif (len(scorelist) == 1) and (scorelist[0][0] != letter):
        return 'lol. stop trying to crash my program'
    else:
        return letterScore(letter, scorelist[1:])

scorelist = [ ["a", 1], ["b", 3], ["c", 3], ["d", 2], ["e", 1], ["f", 4], ["g", 2], ["h", 4], ["i", 1], ["j", 8], ["k", 5], ["l", 1], ["m", 3], ["n", 1], ["o", 1], ["p", 3], ["q", 10], ["r", 1], ["s", 1], ["t", 1], ["u", 1], ["v", 4], ["w", 4], ["x", 8], ["y", 4], ["z", 10] ]

def wordScore(S, scorelist):
    if (len(S) == 1):
        return letterScore(S[0],scorelist)
    elif (letterScore(S[0],scorelist) == 'lol. stop trying to crash my program'):
        return 'you really want to crash me, dont you'
    else:
        return letterScore(S[0],scorelist) + wordScore(S[1:], scorelist)


def perm(l):
    sz = len(l)
    if sz <= 1:
        return [l]
    return [p[:i]+[l[0]]+p[i:]
        for i in xrange(sz) for p in perm(l[1:])]


from itertools import combinations, permutations

def findall(my_input):
    return [''.join(p) for x in range(len(my_input)) for c in combinations(my_input, x+1)
            for p in permutations(c)]

d = ["a", "am", "cab", "apple", "at", "bat", "bar", "babble", "can", "foo", "spam", "spammy", "zzyzva"]

def match(lis): 
    return match2(findall(lis))

def match2(lis): 
    if lis == []:
        return []
    elif(len(d) != ind(lis[0],d)):
        return [lis[0]] + match2(lis[1:])
    else:
        return match2(lis[1:])

def scoreList(lis):
    return match3(match(lis))

def match3(lis):
    if (lis == []):
        return []
    else:
        return [[lis[0],wordScore(lis[0],scorelist)]] + match3(lis[1:])
来自itertools导入链,组合
定义索引(e,L):
如果L==[]或L==“”:
返回0
elif L[0]==e:
返回0
其他:
返回ind(e,L[1:])+1
def letterScore(字母、分数表):
如果得分列表[0][0]==字母:
返回记分表[0][1]
elif(len(scorelist)==1)和(scorelist[0][0]!=字母):
返回“lol.停止尝试使我的程序崩溃”
其他:
返回letterScore(字母,分数表[1:])
分数表=[“a”,1],“b”,3],“c”,3],“d”,2],“e”,1],“f”,4],“g”,2],“h”,4],“i”,1],“j”,8],“k”,5],“l”,1],“m”,3],“n”,1],“q”,10],“r”,1],“s”,1],“t”,1],“u”,1],“v”,4],“w”,4],“x”,8],“y”,4],“z”,10]]
def wordScore(分数列表):
如果(len=1):
返回信分数(S[0],分数列表)
elif(letterScore(S[0],scorelist)==“lol.停止尝试使我的程序崩溃”):
return“你真的想让我崩溃,不是吗”
其他:
返回letterScore(S[0],分数列表)+wordScore(S[1:],分数列表)
def perm(左):
sz=len(l)

如果sz这是家庭作业,还是可以使用itertools

>>> my_input = ['a','b','c']
>>> from itertools import combinations, permutations
>>> [''.join(p) for x in range(len(my_input)) for c in combinations(my_input, x+1)
                for p in permutations(c)]
['a', 'b', 'c', 'ab', 'ba', 'ac', 'ca', 'bc', 'cb', 'abc', 'acb', 'bac', 'bca', 'cab', 'cba']

可能不是最具可读性的解决方案,但这里有另一个解决方案,使用
itertools
,如下所示:


前面的答案显示了
itertools
软件包的用法,但如果您不想使用它(家庭作业是您这样做的唯一原因),我发现算法是最容易实现的。

错误消息缺失。。。请附加
不是错误消息,它是通过调用
allperm()
返回的生成器的文本表示。重复此操作以检索值。正如@kindall所说的,只需尝试列表(allperm('abc')),这是硬件的一部分,因此我不能使用itertools,但这不是全部赋值。这正是我遇到的问题。请注意,不鼓励在列表上使用
sum()
,因为它具有二次性performance@gnibbler对这就是我链接到另一个答案的原因:)
>>> from itertools import permutations
>>> inpt = ['a', 'b', 'c']
>>> sum([map(''.join, list(permutations(inpt, l + 1))) for l in xrange(len(inpt))], [])
['a', 'b', 'c', 'ab', 'ac', 'ba', 'bc', 'ca', 'cb', 'abc', 'acb', 'bac', 'bca', 'cab', 'cba']