2017-03-27 78 views
2

我有一個列表板列表boardsboards包含許多子列表,每個列表中都有相同類型的棋盤。基本上:[[...], [...], ...]將每個子列表項與每個其他子列表中的每個項匹配(python)

假設第一個子列表是1,第二個子列表是2.我需要比較1的每個元素與2的每個元素。所以,我需要對(1[0], 2[0]), (1[0], 2[1])...(1[0], 2[len(2)-1]);(1[0], 2[0])...

問題是,我不知道boards有多少個子列表,這意味着我不能僅僅執行n for循環。這就是我現在所擁有的:

for sublist in boards: 
    for board in sublist: 
     for board_indices in itertools.permutations(range(len(sublist)), len(boards)): 
      matched_boards = [boards[a][j] for a, j in enumerate(i)] 

但我認爲我正在超越它。我相信有一個更簡單,更簡單,更可讀的方法來做到這一點,但我不知道它是什麼。

+0

你的問題有點不清楚。你想從'board'中的每一對子列表中生成每一對項目嗎? –

+0

此外,您發佈的代碼有點奇怪。你的'board_indices'循環對'board_indices'中產生的排列沒有任何作用,並且你有一個未定義的變量'i'。 –

+0

@ PM2Ring是的,這是正確的。另外,對於'i'變量我很抱歉,我試圖讓我的代碼更具可讀性,忘記用'board_indices'替換'i'。 – rassar

回答

2

如果只有你想對,你可以用itertools.product結合itertools.combinations給每一個可能的交叉子表對:

for sublist_pair in itertools.combinations(nested_iter, 2): 
    for item_pair in itertools.product(*sublist_pair): 
     print(item_pair) 

,並提供:

(1, 'a') 
(1, 'b') 
(1, 'c') 
(2, 'a') 
(2, 'b') 
(2, 'c') 
(3, 'a') 
(3, 'b') 
(3, 'c') 
(1, 0.1) 
(1, 0.2) 
(1, 0.3) 
(2, 0.1) 
(2, 0.2) 
(2, 0.3) 
(3, 0.1) 
(3, 0.2) 
(3, 0.3) 
('a', 0.1) 
('a', 0.2) 
('a', 0.3) 
('b', 0.1) 
('b', 0.2) 
('b', 0.3) 
('c', 0.1) 
('c', 0.2) 
('c', 0.3) 
+0

我認爲你的第二個解決方案是OP想要的,但我想我們只能拭目以待。 :) –

+0

是的,你的第二個工作。謝謝! :) – rassar

+0

刪除了錯誤的替代答案 – ayoon

相關問題