具有不同索引的多个列表的所有组合

问题描述 投票:0回答:4

我有 M 个元素的 N 个列表(每个列表),N < M.

我想从他们那里获得所有符合条件的组合:

  • 每个组合有N个元素,
  • 组合的所有索引(来自原始列表)都是唯一的。

3(N) 个列表,每个 4(M) 个列表的示例:

list1 = [d11,d12,d13,d14]
list2 = [d21,d22,d23,d24]
list3 = [d31,d32,d33,d34]

所有预期的组合:

comb1 = [d11,d22,d33]
comb2 = [d11,d22,d34]
comb3 = [d11,d23,d32]
comb4 = [d11,d23,d34]
comb5 = [d11,d24,d32]
comb6 = [d11,d24,d33]
comb7 = [d12,d21,d33]
comb8 = [d12,d21,d34]
comb9 = [d12,d23,d31]
comb10 = [d12,d23,d34]
comb11 = [d12,d24,d31]
comb12 = [d12,d24,d33]
comb13 = [d13,d21,d32]
comb14 = [d13,d21,d34]
comb15 = [d13,d22,d31]
comb16 = [d13,d22,d34]
comb17 = [d13,d24,d31]
comb18 = [d13,d24,d32]
comb19 = [d14,d21,d32]
comb20 = [d14,d21,d33]
comb21 = [d14,d22,d31]
comb22 = [d14,d22,d33]
comb23 = [d14,d23,d31]
comb24 = [d14,d23,d32]

意想不到的组合:

notcomb1 = [d11,d21,d32]
(d11和d21从原来的list1和list2有相同的索引0)

notcomb1 = [d11,d22,d31]
(d11和d31从原来的list1和list3有相同的索引0)
...

如何通过python得到这个?

python list combinations python-itertools
4个回答
0
投票

我想你问的是从 M 中选择 N 的排列。

from itertools import permutations

for idx_1, idx_2, idx_3 in permutations(range(4), 3):
    print(idx_1, idx_2, idx_3)

0
投票

要获取要从中采样的列,请使用

itertools.combinations

要获取要采样的行,请使用

itertools.permutations

import itertools

data = [
    ["d11", "d12", "d13", "d14"],
    ["d21", "d22", "d23", "d24"],
    ["d31", "d32", "d33", "d34"],
]

for columns in itertools.combinations(range(len(data[0])), r=len(data)):
    for rows in itertools.permutations(range(len(data))):
        print([data[y][x] for x,y in zip(columns, rows)])
['d11', 'd22', 'd33']
['d11', 'd32', 'd23']
['d21', 'd12', 'd33']
['d21', 'd32', 'd13']
['d31', 'd12', 'd23']
['d31', 'd22', 'd13']
['d11', 'd22', 'd34']
['d11', 'd32', 'd24']
['d21', 'd12', 'd34']
['d21', 'd32', 'd14']
['d31', 'd12', 'd24']
['d31', 'd22', 'd14']
['d11', 'd23', 'd34']
['d11', 'd33', 'd24']
['d21', 'd13', 'd34']
['d21', 'd33', 'd14']
['d31', 'd13', 'd24']
['d31', 'd23', 'd14']
['d12', 'd23', 'd34']
['d12', 'd33', 'd24']
['d22', 'd13', 'd34']
['d22', 'd33', 'd14']
['d32', 'd13', 'd24']
['d32', 'd23', 'd14']

0
投票
from itertools import permutations

data = [
    ["d11", "d12", "d13", "d14"],
    ["d21", "d22", "d23", "d24"],
    ["d31", "d32", "d33", "d34"],
]

for p in permutations(zip(*data), len(data)):
    print([v[i] for i, v in enumerate(p)])

输出(在线尝试!):

['d11', 'd22', 'd33']
['d11', 'd22', 'd34']
['d11', 'd23', 'd32']
['d11', 'd23', 'd34']
['d11', 'd24', 'd32']
['d11', 'd24', 'd33']
['d12', 'd21', 'd33']
['d12', 'd21', 'd34']
['d12', 'd23', 'd31']
['d12', 'd23', 'd34']
['d12', 'd24', 'd31']
['d12', 'd24', 'd33']
['d13', 'd21', 'd32']
['d13', 'd21', 'd34']
['d13', 'd22', 'd31']
['d13', 'd22', 'd34']
['d13', 'd24', 'd31']
['d13', 'd24', 'd32']
['d14', 'd21', 'd32']
['d14', 'd21', 'd33']
['d14', 'd22', 'd31']
['d14', 'd22', 'd33']
['d14', 'd23', 'd31']
['d14', 'd23', 'd32']

0
投票

这基本上是 n 指数的 m 长度排列:

from itertools import permutations

data = [
    ["d11", "d12", "d13", "d14"],
    ["d21", "d22", "d23", "d24"],
    ["d31", "d32", "d33", "d34"],
]
for indices in permutations(range(len(data[0])), len(data)):
    print([lst[index] for lst, index in zip(data, indices)])

这输出:

['d11', 'd22', 'd33']
['d11', 'd22', 'd34']
['d11', 'd23', 'd32']
['d11', 'd23', 'd34']
['d11', 'd24', 'd32']
['d11', 'd24', 'd33']
['d12', 'd21', 'd33']
['d12', 'd21', 'd34']
['d12', 'd23', 'd31']
['d12', 'd23', 'd34']
['d12', 'd24', 'd31']
['d12', 'd24', 'd33']
['d13', 'd21', 'd32']
['d13', 'd21', 'd34']
['d13', 'd22', 'd31']
['d13', 'd22', 'd34']
['d13', 'd24', 'd31']
['d13', 'd24', 'd32']
['d14', 'd21', 'd32']
['d14', 'd21', 'd33']
['d14', 'd22', 'd31']
['d14', 'd22', 'd33']
['d14', 'd23', 'd31']
['d14', 'd23', 'd32']

演示:https://replit.com/@blhsing/BlueDimgreyTests

© www.soinside.com 2019 - 2024. All rights reserved.