麻烦将列表附加到另一个列表

时间:2015-03-26 04:46:04

标签: python list loops

我有这个代码,它将所有那些加起来为21的数字和组合在一起。我的问题是,最后我希望所有数字都是列表中的列表,但我无法实现这一点。任何建议将不胜感激

def twentyone(seq, groups = []):
goal = 21
s = sum(groups)
final = []
if s == goal:
    final.append(groups)
    print (final)
if s >= goal:
    return

for i in range(len(seq)):
    n = seq[i]       
    remaining = seq[i+1:]
    twentyone(remaining, groups + [n])


#
seq = [1, 5, 6, 7, 10, 2, 11]
(twentyone(seq))

当前输出为:

[[1, 5, 6, 7, 2]]
[[1, 7, 2, 11]]
[[5, 6, 10]]
[[10, 11]]

我希望输出为:

[[1, 5, 6, 7, 2], [1, 7, 2, 11], [5, 6, 10], [10, 11]]

2 个答案:

答案 0 :(得分:2)

每次递归调用自身时,都会创建新的final列表。您只需将其作为默认参数传递。

def twentyone(seq, groups = [], final = []): #default final list
    goal = 21
    s = sum(groups)

    if s == goal:
        final.append(groups)

    if s >= goal:
        return

    for i in range(len(seq)):
        n = seq[i]       
        remaining = seq[i+1:]
        twentyone(remaining, groups + [n])

    return final


seq = [1, 5, 6, 7, 10, 2, 11]
print twentyone(seq)

结果: -

[[1, 5, 6, 7, 2], [1, 7, 2, 11], [5, 6, 10], [10, 11]]

但是,每次调用twentyone函数时,上述解决方案都会导致最终列表增长。因此,我们只能在第一次使用final标志调用时创建一个新的first_call列表,如下所示:

def twentyone(seq, groups = None, final = None, first_call=True): 

    if not groups:
        groups = []

    if first_call:
        final = []

    goal = 21
    s = sum(groups)

    if s == goal:
        final.append(groups)

    if s >= goal:
        return

    for i in range(len(seq)):
        n = seq[i]       
        remaining = seq[i+1:]
        twentyone(remaining, groups + [n], final, False)

    return final


seq = [1, 5, 6, 7, 10, 2, 11]
print twentyone(seq)
print twentyone(seq)

收率:

[[1, 5, 6, 7, 2], [1, 7, 2, 11], [5, 6, 10], [10, 11]]
[[1, 5, 6, 7, 2], [1, 7, 2, 11], [5, 6, 10], [10, 11]]

答案 1 :(得分:0)

延伸Tanveers答案(在我看来这是最好的方法),你也可以将最终变量移到外面,甚至使用静态变量。代码中的主要问题是您在每个递归调用中创建新的最终变量。下面这些代码修复了这个问题。

局部变量方法:

final = []

def twentyone(seq, groups = []):
    goal = 21
    s = sum(groups)
    if s == goal:
        final.append(groups)
    if s >= goal:
        return

    for i in range(len(seq)):
        n = seq[i]       
        remaining = seq[i+1:]
        twentyone(remaining, groups + [n])
seq = [1, 5, 6, 7, 10, 2, 11]
twentyone(seq)
print (final)

静态变量方法:

class myfinal:
    final=[]
def twentyone(seq, groups = []):
    goal = 21
    s = sum(groups)
    if s == goal:
        myfinal.final.append(groups)
    if s >= goal:
        return

    for i in range(len(seq)):
        n = seq[i]       
        remaining = seq[i+1:]
        twentyone(remaining, groups + [n])


seq = [1, 5, 6, 7, 10, 2, 11]
twentyone(seq)
print (myfinal.final)