2013-06-11 4 views
0

В Python существует ли лучший способ получить набор комбинаций из n элементов из набора k-элементов, чем вложенные для циклов или списков?Создание комбинаций (Python)

Например, из набора [1,2,3,4,5,6] Я хочу получить [(1,2), (1,3), (1,4), (1, 5), (1,6), (2,3), (2,4), (2,5), (2,6), (3,4), (3,5), (3,6) , (4,5), (4,6), (5,6)]. Лучше ли это сделать, чем

nums=[1,2,3,4,5,6] 
doubles=[] 
for a in nums: 
    for b in nums[a+1:] 
     doubles.append((a,b)) 

? Все в порядке, если элементы списка, в которые мы попали, - это наборы, кортежи или списки; Я просто чувствую, что должен быть более простой способ сделать это.

+0

для Google точное название вопроса и нажмите на первую ссылку. – Blender

ответ

3

Модуль itertools имеет множество действительно мощных инструментов, которые можно использовать в таких ситуациях. В этом случае вы хотите itertools.combinations. Некоторые другие, которые вы можете найти полезными, - itertools.combinations_with_replacement и itertools.permutations.

Пример:

>>> import itertools 
>>> list(itertools.combinations(range(1,7),2)) 
[(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 3), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6), (4, 5), (4, 6), (5, 6)] 
>>> list(itertools.combinations_with_replacement(range(1,7),2)) 
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (3, 3), (3, 4), (3, 5), (3, 6), (4, 4), (4, 5), (4, 6), (5, 5), (5, 6), (6, 6)] 
>>> list(itertools.permutations(range(1,7),2)) 
[(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 3), (2, 4), (2, 5), (2, 6), (3, 1), (3, 2), (3, 4), (3, 5), (3, 6), (4, 1), (4, 2), (4, 3), (4, 5), (4, 6), (5, 1), (5, 2), (5, 3), (5, 4), (5, 6), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5)] 
3

Вы можете использовать itertools.combinations:

>>> from itertools import combinations 
>>> nums = [1,2,3,4,5,6] 
>>> list(combinations(nums, 2)) 
[(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 3), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6), (4, 5), (4, 6), (5, 6)] 
1

Вы можете использовать модуль itertools

import itertools 
alphabet = ['1','2','3','4','5','6'] 
combos = list(itertools.combinations(alphabet, 2)) 
print combos