我从数据库中获取数据。从数据库中,它们以元组的形式出现:
[('test1', 'test12', 'test13', 'test14'),
('test21', 'test22', 'test23', 'test24'),
('test31', 'test32', 'test33', 'test34'),
('test41', 'test42', 'test43', 'test44'),
('test51', 'test52', 'test53', 'test54'),
('test61', 'test62', 'test63', 'test64'),
('test71', 'test72', 'test73', 'test74'),
('test81', 'test82', 'test83', 'test84'),
('test91', 'test92', 'test93', 'test94'),
('test11', 'test12', 'test13', 'test14')]
这就是我想要的: 组合这些输入...所以输出我有4个参数(例如在例子中)和...
的组合1)最重要的是,新组合,值总是在其位置,即如果在原始组合中值为索引[1],这意味着在新组合中,它应该也是[1] ......
2)没有重复的组合
例如:
我得到了元组:
[('test91', 'test92', 'test93', 'test94'),
('test11', 'test12', 'test13', 'test14')]
从此我得到了新的组合:
[('test91', 'test12', 'test13', 'test14'),
('test11', 'test92', 'test93', 'test94')]
也许可以使用成对或其他方法。 帮助
答案 0 :(得分:0)
您需要使用内置包product
中的itertools
方法,该方法提供输入可迭代的笛卡尔积。
以下代码可以满足您的需求。 但要小心,因为巨大的列表会产生大量的组合,尽量不要耗尽内存。
from itertools import product
data = [('test91', 'test92', 'test93', 'test94'),
('test11', 'test12', 'test13', 'test14')]
b = list(zip(*a)) # making list of n-th elements
# b = [('test91', 'test11'), <- first elements
# ('test92', 'test12'), <- second elements
# ('test93', 'test13'), <- third elements
# ('test94', 'test14')]
variations = product(*b)
output = set(variations) - set(a) # this is unique variations without input data
# output = {('test11', 'test12', 'test13', 'test94'),
# ('test11', 'test12', 'test93', 'test14'),
# ('test11', 'test12', 'test93', 'test94'),
# ('test11', 'test92', 'test13', 'test14'),
# ('test11', 'test92', 'test13', 'test94'),
# ('test11', 'test92', 'test93', 'test14'),
# ('test11', 'test92', 'test93', 'test94'),
# ('test91', 'test12', 'test13', 'test14'),
# ('test91', 'test12', 'test13', 'test94'),
# ('test91', 'test12', 'test93', 'test14'),
# ('test91', 'test12', 'test93', 'test94'),
# ('test91', 'test92', 'test13', 'test14'),
# ('test91', 'test92', 'test13', 'test94'),
# ('test91', 'test92', 'test93', 'test14')}
如果您希望输出与输入数据一致,您只需
output = set(variations)
如果您需要列表而不是设置,请执行
output = list(output)