2016-12-31 33 views
-2

我拼命試圖在強制執行位置分配約束時獲取列表的所有排列組合。 我有一個列表[1,2,3,4,5,6](6只是一個例子,我想找到一些可以用於每個長度的東西),我想查找所有列表中的長度爲3的列表(還一個例子)有以下限制:具有約束條件的列表的排列python

  • 位置1可以通過數字1和2
  • 位置2可以用數字1,2和3
  • 位置3被佔用被佔用可通過數字被佔用2,3和4
  • 不允許重複相同數字

這將給出這些列表:[1,2,3],[1,2,4],[1,3,2],[1,3,4],[2,1,3],[ 2,3,4],[2,1,4]

For those interested, what I am trying to implement is what is explained pages 5 and 6 of this paper

+0

所以你需要*產品*然後這些數字('itertools.product([1,2],[1,2,3],[2,3,4])'),與少數獨特的號碼過濾? –

+0

這種僞代碼出現在該pdf的第8頁,不是嗎? –

+0

實際上在第8頁中沒有找到另一個代碼,旨在找到將第一個節點鏈接到最後一個節點的最短路徑。我試圖手動生成笛卡爾產品,然後刪除我不想要的元素,但這是無止境的 – Jkev

回答

2

篩選那些子集的product()

from itertools import product 

for combo in product([1, 2], [1, 2, 3], [2, 3, 4]): 
    if len(set(combo)) == 3: 
     print(combo) 

或作爲列表理解:

[combo for combo in product([1, 2], [1, 2, 3], [2, 3, 4]) if len(set(combo)) == 3] 

輸出:

>>> from itertools import product 
>>> [combo for combo in product([1, 2], [1, 2, 3], [2, 3, 4]) if len(set(combo)) == 3] 
[(1, 2, 3), (1, 2, 4), (1, 3, 2), (1, 3, 4), (2, 1, 3), (2, 1, 4), (2, 3, 4)]