2013-10-25 3 views
-1

Я хочу, чтобы все перестановки и комбинации списков списков, которые у меня есть, я использую itertools.product для вычисления перестановки, но мой компьютер зависает в течение неопределенного времени. Что я могу делать неправильно?Перестановка списков списка python

import itertools 

#Lists of all the possible dimensions 
upperchest_dim=range(32,52,1) 
upperback_dim=range(32,52,1) 
chest_dim=range(32,52,1) 
waist_dim=range(32,52,1) 
hip_dim=range(32,52,1) 
bicep_dim=range(32,52,1) 
elbow_dim=range(32,52,1) 
thigh_dim=range(32,52,1) 
knee_dim=range(32,52,1) 
calf_dim=range(32,52,1) 
height_dim=range(32,52,1) 

#List of lists total 
dimensions=[upperchest_dim,upperback_dim,chest_dim,waist_dim,hip_dim,bicep_dim,elbow_dim,thigh_dim,knee_dim,calf_dim,height_dim] 

#Generate permutations of all the dimensions 
print list(itertools.product(*dimensions)) 

The list(itertools.product(*dimensions)) должны иметь все уникальные перестановки возможных для всех размеров.

- EDIT: Я думаю, что я делаю что-то неправильно. Я хочу список списков, который имеет все уникальные размеры, например [32,33,34,45,34,23,42,43,43,45,33] Это одно измерение, и результат не должен содержать этого точного снова, поскольку это представляет один тип тела.

+0

Затем гнездо ваш 'list (itertools.product (* dimensions))' –

+0

range (32, 52, 1) - 20 номеров. Вы получили 11 из них. что означает 20 ** 11 комбинаций, что составляет примерно 2. * 10 ** 14. Если вы используете int8 (что возможно, я думаю, в этом случае), вы используете 1 байт на номер. Это означает, что вам нужно 2 * 10 ** 5 Гб бара, чтобы сохранить все это. Что-то подсказывает мне, что у вас этого не так много. (Это все в предположении, что я понимаю ваш вопрос/код) – usethedeathstar

+0

Хорошо, тогда я думаю, что я делаю что-то неправильно. Я хочу список списков, который имеет все уникальные размеры, например [32,33,34,45,34,23,42,43,43,45,33] Это одно измерение, и результат не должен содержать этот список еще раз. Я думаю, что у меня будет 4400 таких размеров (20 * 11 * 20). Th – rajat

ответ

3

В этом списке было бы 20 ** 11 = 2 ** 11 * 10 ** 11 = 204800000000000 элементов. Вот что случилось.

Хотя itertools.product - это итератор, который не вешал бы бесконечно (для его чередования потребовалось бы очень много времени, чтобы перебрать все его), превратив его в список(), пока он не использует всю память.

1

Нет необходимости все эти вещи, вы можете просто использовать permutations:

from itertools import permutations 

var = permutations([12, 34, 123, 12, 31, 231]) 

for perm in var: 
    print perm 

Даже работает с list списков:

from itertools import permutations 

var = permutations([[1, 2, 3, 4], [24, 5, 12, 3], 123, 12, 31, 231]) 

for perm in var: 
    print perm 

Работа example.

Если по какой-то причине вы хотите все возможные перестановки, даже перестановок списков в списке, то вам придется использовать следующий код:

from itertools import permutations 

var = [[1, 2, 3, 4], [24, 5, 12, 3], 123, 12, 31, 231] 

# Getting all permutations of lists within the lists 
output = [] 
for l in var: 
    if isinstance(l, list): 
     output += permutations(l) 
    else: 
     output.append(l) 

perm = permutations(output) 

for p in perm: 
    print p 

Working example.

0

Если на последней строке у

for d in itertools.product(*dimensions): print(d)

это начать печатать

... (32, 32, 32, 32, 32, 32, 32, 33, 37, 47, 45) (32, 32, 32, 32, 32, 32, 32, 33, 37, 47, 46) (32, 32, 32, 32, 32, 32, 32, 33, 37, 47, 47) (32, 32, 32, 32, 32, 32, 32, 33, 37, 47, 48) ...

Так что «ничего» не является неправильным, результирующий список так просто чрезвычайно большой, что не может быть вычислен все раз

+0

Кажется, что это дает правильные результаты. Хотя, он дает все перестановки, я хочу только уникальные списки. Например: (32, 32, 32, 32, 32, 32, 32, 33, 37, 47, 45), это не должно повторяться. – rajat

+0

Если вам нужны только уникальные списки, вместо этого используйте 'комбинации'. не то, что вы закончите этот расчет до окончания юниверса :) –

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