我的函数combinations(ary, p)适合于return,每个可能的组合,按列表中项目的顺序排列。但是它总是多次返回第一个值,即使它找到所有可能的命令,我知道,因为它打印它们。
编辑:我想让它发挥我自己的作用,学习一些东西,不使用任何外部语言。
def combinations(ary, p):
ln = len(ary)
bary=[]
for a in range(ln-p):
if p<ln-2:
bb = combinations(ary, p+1)
for be in bb:
bary.append(be)
if p>=ln-2:
bary.append(ary)
ary.append(ary.pop(p))
return bary另一个带有调试print()函数的版本。我会给出它的样本输出。
def combinations(ary, p):
ln = len(ary)
bary=[]
for a in range(ln-p):
if p<ln-2:
bb = combinations(ary, p+1)
for be in bb:
bary.append(be)
if p>=ln-2:
--> bary.append(ary)
--> print('ary', ary, 'bary', bary)
ary.append(ary.pop(p))
return bary使用combinations([7,3,2], 0):运行后的控制台输出
## There is clearly every possible combination:
##
## ||
## ||
\/
ary [7, 3, 2] bary [[7, 3, 2]]
ary [7, 2, 3] bary [[7, 2, 3], [7, 2, 3]]
ary [3, 2, 7] bary [[3, 2, 7]]
ary [3, 7, 2] bary [[3, 7, 2], [3, 7, 2]]
ary [2, 7, 3] bary [[2, 7, 3]]
ary [2, 3, 7] bary [[2, 3, 7], [2, 3, 7]]
[[7, 3, 2], [7, 3, 2], [7, 3, 2], [7, 3, 2], [7, 3, 2], [7, 3, 2]]最后一个列表被设定为包含每一个可能的顺序,但是它只有输入值顺序,即使它打印每一个顺序。我在哪里搞砸了return
发布于 2020-03-05 19:54:28
你的问题是只有一份副本。你把它附加到bary很多次了。所以bary充满了同样的一份名单。任何时候你都会改变的。这将反映在所有这些问题上,因为它们都是相同的清单。
相反,当您附加到bary时,分配一个ary的副本,但作为它自己的一个新列表,这样当您更改ary时,它不会受到影响。
def combinations(ary, p):
ln = len(ary)
bary=[]
for a in range(ln-p):
if p<ln-2:
bb = combinations(ary, p+1)
for be in bb:
bary.append(be)
if p>=ln-2:
bary.append(ary[:]) #Changed this line to take a shallow copy of ary
print('ary', ary, 'bary', bary)
ary.append(ary.pop(p))
return bary
print(combinations([7,3,2], 0))输出
ary [7, 3, 2] bary [[7, 3, 2]]
ary [7, 2, 3] bary [[7, 3, 2], [7, 2, 3]]
ary [3, 2, 7] bary [[3, 2, 7]]
ary [3, 7, 2] bary [[3, 2, 7], [3, 7, 2]]
ary [2, 7, 3] bary [[2, 7, 3]]
ary [2, 3, 7] bary [[2, 7, 3], [2, 3, 7]]
[[7, 3, 2], [7, 2, 3], [3, 2, 7], [3, 7, 2], [2, 7, 3], [2, 3, 7]]https://stackoverflow.com/questions/60552655
复制相似问题