2016-06-23 40 views
2

我是一個(非常)初學者程序員,尤其是Python新手。如何用指定的域和範圍生成所有的內射函數?

我想採取指定的域和特定的範圍,並生成內射圖。例如,我可以使域爲A = [1,2],範圍爲B = [1,3],我希望輸出看起來像「(1 - > 1,2 - > 3), (1→3,2→1)「。或者像((1,1),(2,3))和((1,3),(2,1))就可以。作爲另一個例子,我可以取A = [2,3]和B = [1,2],並且我想要「(2→1,3→2),(2→2),3(3→4) - > 1)「。

我最好嘗試是

A = [1, 2] 
B = [1, 3] 
C = [] 
for x in A: 
    for y in B: 
     C.append((x, y)) 

產生列表[(1,1),(1,3),(2,1),(2,3)]。我明白爲什麼會出現這種情況,但我想不出有什麼辦法來實際生產我想要的東西。

我將使用基本的Python工具,如循環,列表,集合等更喜歡一個解決方案

回答

3

置換兩個列表中的一個(from itertools import permutations),併爲每個排列做一個對一個映射(zip(..))。

>>> from itertools import permutations 
>>> a = [1,2,3] 
>>> b = [4,5,6] 
>>> [zip(a, x) for x in permutations(b)] 
[[(1, 4), (2, 5), (3, 6)], [(1, 4), (2, 6), (3, 5)], [(1, 5), (2, 4), (3, 6)], [(1, 5), (2, 6), (3, 4)], [(1, 6), (2, 4), (3, 5)], [(1, 6), (2, 5), (3, 4)]] 

運行它爲您的示例:

>>> a = [1,2] 
>>> b = [1,3] 
>>> [zip(a, x) for x in permutations(b)] 
[[(1, 1), (2, 3)], [(1, 3), (2, 1)]] 
相關問題