2015-12-18 5 views
0

Я хочу генерировать списки из четырех простых чисел во всех возможных комбинациях, чтобы числа никогда не повторялись в этом списке.Получение всех простых комбинаций с 4 для циклов - Python

Я знаю, как получить то, что я хочу с помощью этой функции:

def combinations(): 
    primeList = [2, 3, 5, 7, 11, 13, 17] 
    length = len(primeList) 
    for i in range(0, length-3): 
     for j in range(i+1, length-2): 
      for k in range(j+1, length-1): 
       for h in range(k+1, length): 
        print([primeList[i], primeList[j], primeList[k], primeList[h]]) 

который возвращает такие списки: http://postimg.org/image/94u3hzgqb/

Но я хочу, чтобы использовать код, построенный, как показано ниже, потому что я хочу эту конкретную структуру и хотите знать причину, по которой она не действует так же, как функция, которую я только что скопировал.

def combinations2(): 
    primeList = [2, 3, 5, 7, 11, 13, 17] 
    for i1, i in enumerate(primeList[0: -3]): 
     for i2, j in enumerate(primeList[i1+1: -2]): 
      for i3, k in enumerate(primeList[i2+1: -1]): 
       for h in primeList[i3+1:]: 
        print([i, j, k, h]) 

который возвращает список с повторяющимися элементами: http://postimg.org/image/y0h0gwfhf/

Видимо я использую для цикла с Перечислим неправильный путь, но не могу понять, где я мог бы неправильно. Для меня обе функции выглядят так, как будто они должны делать то же самое.

Если вы можете, пожалуйста, укажите ошибку, которую я делаю или исправляю в противном случае.

+5

Рассматривали ли вы [itertools.combinations] (https://docs.python.org/2/library/itertools .html # itertools.combinations)? Например. 'itertools.combinations (primeList, 4)' –

+0

Вам действительно нужны петли? Попробуйте 'itertools.combinations' и ответьте на [that] (http://stackoverflow.com/questions/464864/python-code-to-pick-out-all-possible-combinations-from-a-list) вопрос –

ответ

1

Это потому, что i1, i2, i3 начинаются с нуля. На первой итерации, то есть

primeList[i1+1: -2] = [3, 5, 7, 11] 
primeList[i2+1: -1] = [3, 5, 7, 11, 13] 
primeList[i3+1:] = [3, 5, 7, 11, 13, 17] 

Это правильная функция:

def combinations2(): 
    primeList = [2, 3, 5, 7, 11, 13, 17] 
    for i1, i in enumerate(primeList[0: -3]): 
     for i2, j in enumerate(primeList[i1+1: -2]): 
      for i3, k in enumerate(primeList[i1+i2+2: -1]): 
       for h in primeList[i1+i2+i3+3:]: 
        print([i, j, k, h]) 
+0

Ровно что я хотел, спасибо! – Larisa

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