繁体   English   中英

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM