2013-11-02 2 views
0

Скажем, у меня есть список, как показано ниже:Как сделать одновременные комбинации в python? (itertools)

foo = [256, 456, 24, 79, 14] 
bar = ['a', 'aa', 'dd', 'e', 'b'] 
baz = [2.9, 2.7, 1.9, 2.2, 1.1] 

Я хочу взять пар обув (я знаю, что могу использовать iterools.combinations), но как я его так, что, когда я беру пары элементов в foo, я беру соответствующие пары в bar и baz?

E.g. Когда я пару 256 и 456 в foo, парное 'a' и 'aa' в bar в том же порядке, и 2.9 и 2.7 в том же порядке, в baz?

Кроме того, когда я беру комбинации, я не должен бояться (256, 456) и (456, 256), оба из которых выводятся, поскольку, если мы введем список, упорядоченный, как указано выше, мы должны получить комбинации и не более с перестановками?

+1

'zip' сначала, затем создайте комбинации, распакуйте. –

+0

Должно ли это быть ** mycollection = zip (foo, bar, baz) **, затем ** itertools.combinations (mycollection, 2) **. – user2896468

ответ

1
for c in itertools.combinations(zip(foo, bar, baz), 2): 
    for u in zip(*c): 
     print(u) 

Выход:

(256, 456) 
('a', 'aa') 
(2.9, 2.7) 
(256, 24) 
('a', 'dd') 
(2.9, 1.9) 
(256, 79) 
('a', 'e') 
(2.9, 2.2) 
(256, 14) 
('a', 'b') 
(2.9, 1.1) 
(456, 24) 
('aa', 'dd') 
(2.7, 1.9) 
(456, 79) 
('aa', 'e') 
(2.7, 2.2) 
(456, 14) 
('aa', 'b') 
(2.7, 1.1) 
(24, 79) 
('dd', 'e') 
(1.9, 2.2) 
(24, 14) 
('dd', 'b') 
(1.9, 1.1) 
(79, 14) 
('e', 'b') 
(2.2, 1.1) 
+0

А, я вижу, спасибо, сэр! – user2896468

1

Вы можете сделать комбинации индексов, а затем использовать эти комбинации индексов для доступа отдельных элементов:

indexes = list(range(len(foo))) 
for i, j in itertools.combinations(indexes, 2): 
    print(foo[i], foo[j]) 
    print(bar[i], bar[j]) 
    print(baz[i], baz[j]) 
1

Вот общая функция для группирования комбинаций из любое количество списков:

>>> def grouped_combos(n, *ls): 
...  for comb in itertools.combinations(zip(*ls), n): 
...   yield comb 
>>> list(grouped_combos(2, [256, 456, 24, 79, 14], ['a', 'aa', 'dd', 'e', 'b'])) 
[((256, 'a'), (456, 'aa')), 
((256, 'a'), (24, 'dd')), 
((256, 'a'), (79, 'e')), 
((256, 'a'), (14, 'b')), 
((456, 'aa'), (24, 'dd')), 
((456, 'aa'), (79, 'e')), 
((456, 'aa'), (14, 'b')), 
((24, 'dd'), (79, 'e')), 
((24, 'dd'), (14, 'b')), 
((79, 'e'), (14, 'b'))] 
>>> list(grouped_combos(4, [1, 2, 3, 4, 5], "abcde", "xyzzy")) 
[((1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z'), (4, 'd', 'z')), 
((1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z'), (5, 'e', 'y')), 
((1, 'a', 'x'), (2, 'b', 'y'), (4, 'd', 'z'), (5, 'e', 'y')), 
((1, 'a', 'x'), (3, 'c', 'z'), (4, 'd', 'z'), (5, 'e', 'y')), 
((2, 'b', 'y'), (3, 'c', 'z'), (4, 'd', 'z'), (5, 'e', 'y'))] 

 Смежные вопросы

  • Нет связанных вопросов^_^