2013-10-25 100 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)) 

list(itertools.product(*dimensions))应该具有所有维度可能的所有唯一排列。

- 编辑: 我认为我做错了什么。我想要一个包含所有唯一维度的列表,例如[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 Gb的RAM来存储它。有些事告诉我你没那么多。 (这一切都假设我明白你的问题/代码) – 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是一个不会无限期挂起的迭代器(它只需要很长的时间来遍历所有的迭代器),将它变成一个list()会挂起直到它已经使用了所有的内存。

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 

工作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

如果您只想要唯一的列表,请改用'combinations'。而不是你会在宇宙结束之前完成那个计算:) –