我有 M 个元素的 N 个列表(每个列表),N < M.
我想从他们那里获得所有符合条件的组合:
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得到这个?
我想你问的是从 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)
要获取要从中采样的列,请使用
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']
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']
这基本上是 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']