从元组创建组合

时间:2016-09-22 15:04:56

标签: python python-3.x combinations

我从数据库中获取数据。从数据库中,它们以元组的形式出现:

[('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')]

也许可以使用成对或其他方法。 帮助

1 个答案:

答案 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)
相关问题