29

リストのすべての順列を生成するアルゴリズムを Python で実装しようとしています。しかし、私の for ループでは、元のプレフィックスと残りのリストをそのまま保持したいので、newprefix と newrest を使用してこれらのリストのコピーを作成しようとしていますが、反復ごとに変数の残りを出力すると、変数 rest が変更されています! Pythonでリストの浅いコピーを作成するにはどうすればよいですか? または、試行したロジックに別の問題がありますか?

def perm(prefix, rest):
    if len(rest) == 0:
        print prefix 
    for i in range(len(rest)):
        #prints in the for loop are just for debugging
        print "rest:", rest
        print "i=", i
        newprefix = prefix
        newprefix.append(rest[i])
        newrest = rest
        newrest.pop(i)
        print "old pre : ", prefix
        print "newpre=", newprefix
        print "newrest=", newrest
        perm(newprefix, newrest)


perm([], ['a','b','c'])
4

2 に答える 2

44

浅いコピーを作成するには、リストをスライスできます。

newprefix = prefix[:]

listまたは、コンストラクターに渡します。

newprefix = list(prefix)

また、コードを少し簡素化できると思います。

def perm(prefix, rest):
    print prefix, rest

    for i in range(len(rest)):
        perm(prefix + [rest[i]], rest[:i] + rest[i + 1:])

perm([], ['a','b','c'])
于 2013-04-29T02:26:59.653 に答える