2016-09-22 4 views
-1

Я беру данные из базы данных. Из базы данных они приходят в виде кортежа:Создание комбинаций из кортежа

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

2) нет повторяющихся комбинаций

В качестве примера:

Я получил кортеж:

[('test91', 'test92', 'test93', 'test94'), 
('test11', 'test12', 'test13', 'test14')] 

И от этого я получил новые комбинации:

[('test91', 'test12', 'test13', 'test14'), 
('test11', 'test92', 'test93', 'test94')] 

Может быть, это можно сделать с помощью метод попарно или что-то еще. Помощь.

+0

так что вы хотите сочетание всех Кортежи, это будет много. –

+0

Да, есть много возможных комбинаций. – Koushik

+0

Подход грубой силы: используйте четыре вложенные петли, чтобы поймать все возможные комбинации. Существует n^4 возможных комбинаций (n - количество строк вашего массива с четырьмя кортежами) – jrook

ответ

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) 
Смежные вопросы