组合/跨越分组没有重复

问题描述:

我想找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生成任何排列,每个列表中都有一个元组,每个元组内没有元素重复。

我看着Python itertools的帮助,找不到任何复制这些伪函数的东西。有任何想法吗?

感谢,

迈克

+0

你希望我们会做功课? – 2010-07-05 05:56:20

+0

32岁与妻子和孩子......没有。希望你能帮我写一个Jenny Craig菜单程序。功能1 =在膳食水平上处理膳食(例如0 =“沙拉”)。功能2 =在成分水平上处理膳食(例如0,1 =“胡萝卜”,“生菜”)。 – MikeRand 2010-07-05 06:07:52

from itertools import product 
def function1(*seqs): 
    return (x for x in product(*seqs) if len(x) == len(set(x))) 

>>> list(function1([0,1,2], [0,3,4], [0,2,4])) 
[(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)] 

>>> [(x,y,z) for x in list1 for y in list2 for z in list3 if (x != y and y != z 
and x != z)] 
[(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)] 

的第一个

def f2(first, second): 
    for a in first: 
     for b in second: 
      if len(set(a + b)) == 4: 
       yield (a, b) 

PAR Wieslander了用于功能1是好的解决方法。这里是功能2的一般解决方案

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])) 
+0

道歉...我打破了规则并合并了问题。我怎样才能给你优秀的答案呢? – MikeRand 2010-07-05 11:13:57

+0

不幸的是,你只能接受一个答案。如果你不愿意把事情做好,你可以复制其中一个问题,并邀请gnibbler回答重复问题。但是对于一个近似的近似,我给了他的答案我的投票,所以他至少得到10分:) – 2010-07-06 16:06:52

大家很奇怪,这里是最后的实现:从gnibbler的优秀的解决方案

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)] 

两个变化:现在

1)ARG1是包括每一个列表列表将会出现在参数*中。我只需传递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)]