【问题标题】:find permutations of items in a python list, with an added complexity在 python 列表中查找项目的排列,增加了复杂性
【发布时间】:2012-06-14 20:17:57
【问题描述】:

在我难以解释的时候请多多包涵;我的数学生疏了,我刚开始电脑编程,对不起!

假设我有一个包含 3 个项目的列表。我想在此列表中找到所有可能的项目排列,其中每个排列由 3 个项目组成。

接下来,仍然使用我的原始列表,我想找到列表项的所有可能排列,除了我只希望排列由两个项目组成。

最后,我想再次做同样的事情,除了安排只包含一项。

所以我期待 3! + 3!/1! + 3!/2!,或总共 15 个安排。 只是为了明确说明我想要什么,如果我的列表是 [1, 2, 3],那么代码应该产生:

1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 2
3, 1, 2
3, 2, 1

1, 2
1, 3
2, 1
2, 3
3, 1
3, 2

1
2
3

我在下面写的代码可以做我上面写的,但只适用于长度为 3 的列表。我可以通过添加额外的“for”循环和“elif”语句来修改代码以处理更大长度的列表,但是我觉得必须有一种方法来概括这种模式。我应该怎么做才能获得上述类型的任意长度列表的排列?

我认为我详尽的枚举方法可能会使这比它需要的更复杂......将尝试考虑其他方法并在找到解决方案时更新。

def helperFunction(itemsList):

    fullPermutationsOutputList = []


    def fullPermutations(itemsList, iterations):

        for item1 in itemsList:
            if iterations == 2:
                if len([item1]) == len(set([item1])):
                    fullPermutationsOutputList.append((item1,))
            else:    
                for item2 in itemsList:
                    if iterations == 1:
                        if len([item1, item2]) == len(set([item1, item2])):
                            fullPermutationsOutputList.append((item1, item2))
                    else:
                        for item3 in itemsList:
                            if iterations == 0:
                                if len([item1, item2, item3]) == len(set([item1, item2, item3])):
                                    fullPermutationsOutputList.append((item1, item2, item3))

        if iterations == 0:                        
            fullPermutations(itemsList, iterations + 1)
        elif iterations == 1:
            fullPermutations(itemsList, iterations + 1)

    fullPermutations(itemsList, 0)
    return fullPermutationsOutputList

【问题讨论】:

标签: python list permutation


【解决方案1】:

只需itertools.permutations。如果你想要精确的算法,你可以检查它的来源。

【讨论】:

  • 感谢你们两位。这解决了我的问题,我可以看到它是如何完成的。
  • @Ryan 那么你应该接受罗曼的回答。点击它旁边的复选框。
【解决方案2】:

这会做你想做的事:https://stackoverflow.com/a/10784693/1419494

def perm(list_to_perm,perm_l,items,out):
            if len(perm_l) == items:
                out +=[perm_l]
            else:
                for i in list_to_perm:
                    if i not in perm_l:
                        perm(list_to_perm,perm_l +[i],items,out)


a = [1,2,3]
for i in range(1,len(a) +1):
    out = []
    perm(a,[],i,out)
    print out

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 2012-10-31
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多