列表回溯的python排列

时间:2015-01-27 19:26:33

标签: python

我需要编写一个python程序,按升序打印所有数字列表的排列。我必须写两个程序。一个重复,一个不重复。例如:list是[1,1,3]因此第一个函数输出将是:

1,1,3
1,3,1
3,1,1

和第二个func输出将是:

1,1,3
1,1,3
1,3,1
1,3,1
3,1,1
3,1,1

现在我写了这段代码,但我遇到了Asc命令的问题:

def perm1 (mylist, newlist):

    if len(mylist)==0:
        print ','.join(map(str,newlist))
    for i in range (0, len(mylist)):
        newlist.append(mylist.pop(i))
        perm1(mylist, newlist)
        mylist.insert(i, newlist.pop())

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:2)

itertools.permutations()对此非常完美!您可以像这样使用它:

from itertools import permutations

def perm1(my_list):
    return " ".join(",".join((str(si) for si in i)) for i in sorted(p(my_list))[::-1])

permutations是一个发电机。这会产生每一个排列,但有些排列是等价的。它按升序排列,因为sorted给出了从最低到最高的排列,而[::-1]则排列了它。对于降序,请删除拼接([::-1])。没有重复的一个可以使用sets{0, 5, 6, 7} == {0, 7, 7, 5, 6, 0}

这一事实
from itertools import permutations

def perm2(my_list):
    return " ".join(",".join((str(si) for si in i)) for i in reversed(sorted(set(p(my_list)))))

这显示了使用reversed函数反转的不同方法,但在功能上是相同的。

你可以创建一个带(可选)ascendingkeep_duplicates参数的函数,如果升序为真,则按升序返回,否则降序为升序,keep_duplicates如果为真。

from itertools import permutations as p

def perm3(my_list, keep_duplicates=True, ascending=True):
    splice = -2 * reverse + 1 # -1 if True else 1
    if keep_duplicates:
        return " ".join(",".join((str(si) for si in i)) for i in sorted(p(my_list))[::splice])
    return " ".join(",".join((str(si) for si in i)) for i in sorted(set(p(my_list)))[::splice])

答案 1 :(得分:1)

查看:https://docs.python.org/2/library/itertools.html#itertools.product

添加导入:

shinyServer(
  function(input, output, clientData, session){
    observe({
      if (input$ctrl_gen_customDefault == "conditionA"){
        updateCheckboxGroupInput(session,
                             "ctrl_gen_challengenumber",
                             label = "Challenge Number",
                             choices = c("First" = 1,
                                         "Second" = 2,
                                         "Third" = 3),
                             selected = 2)
      }
    })
  }
)

可重复排列:

from  itertools  import permutations

并且不可重复:

aux = [1,1,3]
#Repeatable permutations
for p in sorted(permutations(aux)):
    print p