2010-07-05 134 views
2

我想找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

回答

4
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)] 
1
>>> [(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)] 

的第一個

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

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

0

大家很奇怪,這裏是最後的實現:從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)]