Python 分组间无重复的组合/排列

Python 分组间无重复的组合/排列,python,c,permutation,combinatorics,Python,C,Permutation,Combinatorics,我正在寻找C或Python代码来实现两个伪代码函数之一: function 1: list1 = [0,1,2] #any list of single-integer elements list2 = [0,3,4] list3 = [0,2,4] function1(list1, list2, list3) >>> (0,3,2),(0,3,4),(0,4,2),(1,0,2),(1,0,4),(1,3,0),(1,3,2),(1,3,4), (1,4,0),

我正在寻找C或Python代码来实现两个伪代码函数之一:

function 1:

list1 = [0,1,2] #any list of single-integer elements
list2 = [0,3,4]
list3 = [0,2,4]

function1(list1, list2, list3)

>>> (0,3,2),(0,3,4),(0,4,2),(1,0,2),(1,0,4),(1,3,0),(1,3,2),(1,3,4),
    (1,4,0),(1,4,2),(2,0,4),(2,3,0),(2,3,4),(2,4,0)
基本上,它生成所有有效的排列,定义为a)每个列表中有一个元素,b)没有具有相同值的元素

function 2:

list1 = [(0,1),(0,2),(0,3)] #any list of double-integer tuples
list2 = [(0,4),(1,4),(2,4)]

function2(list1, list2)
>>> ((0,1),(2,4)) , ((0,2),(1,4)) , ((0,3),(1,4)) , ((0,3),(2,4))
函数2生成每个列表中有一个元组且每个元组中没有重复元素的任何排列

我查看了pythonitertools帮助,没有找到任何复制这些伪函数的东西。有什么想法吗

谢谢

迈克


对于第一个

pär Wieslander为function1提供了一个很好的通用解决方案。下面是function2的一般解决方案

def f2(first, second):
    for a in first:
        for b in second:
            if len(set(a + b)) == 4:
                yield (a, b)
from itertools import product
def function2(*args):
    return [i for i in product(*args) if (lambda x: len(x) == len(set(x)))([k for j in i for k in j])]
当然,如果生成器表达式更符合您的目的,您可以返回它。
例如:

def function2(*args):
    return (i for i in product(*args) if (lambda x: len(x) == len(set(x)))([k for j in i for k in j]))

对于任何想知道的人来说,以下是最终的实现:

def function2(arg1, arg2):
    return [i for i in product(*arg1) if (lambda x: len(x) == len(set(x)))
            ([k for j in i for k in j] + arg2)]
gnibbler卓越解决方案的两个变化:

1) arg1现在是一个列表,其中包含了args*中的所有列表。我不必列出每个arg*,只需传递arg1并将其解压缩到产品(*arg1)中即可。不确定是否有更好的方法来做到这一点

2) arg2是我想从任何组合中排除的东西的列表。将它们包含在lambda函数的参数中,可以进一步约束产品(*arg1)的结果,而无需引入组合

通过命名变量向您展示我正在使用它做什么,下面是确切的代码:

def makeMyMenu(allmeals, dont_eat):
    return [menu for menu in product(*allmeals) if (lambda x: len(x) == len(set(x)))
            ([ingredient for meal in menu for ingredient in meal] + dont_eat)]

你希望我们帮你做作业吗?32岁,有妻子和孩子…不。希望你能帮我写一个珍妮·克雷格的菜单程序。功能1=以膳食水平处理膳食(例如,0=“沙拉”)。功能2=按成分水平(例如0,1=“胡萝卜”、“莴苣”)处理膳食。抱歉……我违反了规则,并将问题组合在一起。我该如何评价你的优秀答案?不幸的是,你只能接受一个答案。如果你急于纠正错误,你可以重复一个问题,并邀请格尼布尔回答重复的问题。但是,对于一个半途而废的近似值,我投了他的票,所以他至少得到了另外10分:)
def function2(arg1, arg2):
    return [i for i in product(*arg1) if (lambda x: len(x) == len(set(x)))
            ([k for j in i for k in j] + arg2)]
def makeMyMenu(allmeals, dont_eat):
    return [menu for menu in product(*allmeals) if (lambda x: len(x) == len(set(x)))
            ([ingredient for meal in menu for ingredient in meal] + dont_eat)]