Python 中的排列无重复
Permutations in Python without repetitions
我正在开发一个程序,它从用户那里获取一个列表作为输入,并应该打印列表的所有排列。
问题是我得到的输出是列表中数字的重复,所以这些在技术上并不是真正的排列。我怎样才能避免这种情况?
(请注意,如果用户在列表中输入相同的数字两次,这不算重复)所以基本上我不能在每个组合中重复相同的索引。
注意:我不允许使用内置 permutations
函数。
这是我到目前为止所做的:
def permutation(numberList,array,place):
if (place==len(numberList)):
print array
else:
i=0
while (i < len(numberList)):
array.append(numberList[i])
permutation(numberList,array,place+1)
array.pop()
i+=1
def scanList():
numberList=[];
number=input()
#keep scanning for numbers for the list
while(number!=0):
numberList.append(number)
number=input()
return numberList
permutation(scanList(),[],0)
1 2 3 0
的输出例如:
[1, 1, 1]
[1, 1, 2]
[1, 1, 3]
[1, 2, 1]
[1, 2, 2]
[1, 2, 3]
[1, 3, 1]
[1, 3, 2]
[1, 3, 3]
[2, 1, 1]
[2, 1, 2]
[2, 1, 3]
[2, 2, 1]
[2, 2, 2]
[2, 2, 3]
[2, 3, 1]
[2, 3, 2]
[2, 3, 3]
[3, 1, 1]
[3, 1, 2]
[3, 1, 3]
[3, 2, 1]
[3, 2, 2]
[3, 2, 3]
[3, 3, 1]
[3, 3, 2]
[3, 3, 3]
谢谢。
一个简单的解决方案是使用 set
来了解哪些号码您已经使用过哪些没有:
def permutation(numberList,array,visited,place):
if (place==len(numberList)):
print array
else:
i=0
while (i < len(numberList)):
if i not in visited:
visited.add(i)
array.append(numberList[i])
permutation(numberList,array,visited,place+1)
array.pop()
visited.remove(i)
i+=1
def scanList():
numberList=[];
number=input()
#keep scanning for numbers for the list
while(number!=0):
numberList.append(number)
number=input()
return numberList
permutation(scanList(),[],set(), 0)
我正在开发一个程序,它从用户那里获取一个列表作为输入,并应该打印列表的所有排列。 问题是我得到的输出是列表中数字的重复,所以这些在技术上并不是真正的排列。我怎样才能避免这种情况? (请注意,如果用户在列表中输入相同的数字两次,这不算重复)所以基本上我不能在每个组合中重复相同的索引。
注意:我不允许使用内置 permutations
函数。
这是我到目前为止所做的:
def permutation(numberList,array,place):
if (place==len(numberList)):
print array
else:
i=0
while (i < len(numberList)):
array.append(numberList[i])
permutation(numberList,array,place+1)
array.pop()
i+=1
def scanList():
numberList=[];
number=input()
#keep scanning for numbers for the list
while(number!=0):
numberList.append(number)
number=input()
return numberList
permutation(scanList(),[],0)
1 2 3 0
的输出例如:
[1, 1, 1]
[1, 1, 2]
[1, 1, 3]
[1, 2, 1]
[1, 2, 2]
[1, 2, 3]
[1, 3, 1]
[1, 3, 2]
[1, 3, 3]
[2, 1, 1]
[2, 1, 2]
[2, 1, 3]
[2, 2, 1]
[2, 2, 2]
[2, 2, 3]
[2, 3, 1]
[2, 3, 2]
[2, 3, 3]
[3, 1, 1]
[3, 1, 2]
[3, 1, 3]
[3, 2, 1]
[3, 2, 2]
[3, 2, 3]
[3, 3, 1]
[3, 3, 2]
[3, 3, 3]
谢谢。
一个简单的解决方案是使用 set
来了解哪些号码您已经使用过哪些没有:
def permutation(numberList,array,visited,place):
if (place==len(numberList)):
print array
else:
i=0
while (i < len(numberList)):
if i not in visited:
visited.add(i)
array.append(numberList[i])
permutation(numberList,array,visited,place+1)
array.pop()
visited.remove(i)
i+=1
def scanList():
numberList=[];
number=input()
#keep scanning for numbers for the list
while(number!=0):
numberList.append(number)
number=input()
return numberList
permutation(scanList(),[],set(), 0)