2014-06-26 65 views
0

我在列表列表中有以下数据。这是一个用于核反应堆的燃料束(具有半对称性),每个数字代表一个燃料销(具有不同的浓缩物)。数字越高燃料越多。我试图生成大量的输入文件来运行(我已经有功能,将我的数组输入到我的输入文件并运行它)。 这仅仅是一个什么样一个阵列会是什么样子如何在python中生成列表的排列列表

20 
30 60 
50 80 80 
60 80 80 80 
60 81 80 80 80 
60 80 80 00 00 80 
60 80 80 00 00 80 80 
50 80 80 80 80 80 80 80 
40 70 80 81 80 80 80 80 80 
20 40 60 70 80 80 70 71 50 30 

所以我将使用规则,以列出样本。像边缘的针脚必须是低浓缩的,不能被10整除的针脚不能在边缘或面对面相邻,或面对00相邻。由于每个点有90个选项,我需要限制了所有的可能性。这就是为什么我想为数组中的每个位置生成一个选项列表,然后生成每个可能的数组。我知道如何实现我所有的规则,我只是对构建所有可能的数组组合感到困惑。

我该如何去为我的数组生成每种可能的组合?或者如果有更好的方法来完成我想要做的事情。我的Python体验只有两周的价值。

+1

我没有看到你的数字三角形应该是什么。 [10,20,30]从哪里来?我没有看到你的列表中的任何一行。 – CoryKramer

+2

你能举出一个你想要完成的更明确的例子吗?你的措辞不清楚。 –

+0

我想我们现在都在想像它的方式是'list [0] [0]'会访问'20'。 '20'与'[10,20,30]'相关吗? – ZWiki

回答

2

如果我理解你,使用itertools模块中的工具相对比较简单。像

from itertools import product, chain 

def choose_from_2d_lol(lol): 
    flattened_options = list(chain.from_iterable(lol)) 
    for p in product(*flattened_options): 
     p_iter = iter(p) 
     new_list = [[next(p_iter) for elem in row] for row in lol] 
     yield new_list 

事情会遍历所有的可能性:

>>> xx = [[[10,20,30]],[[44], [55,66]]] 
>>> for chosen in choose_from_2d_lol(xx): 
...  print(chosen) 
...  
[[10], [44, 55]] 
[[10], [44, 66]] 
[[20], [44, 55]] 
[[20], [44, 66]] 
[[30], [44, 55]] 
[[30], [44, 66]] 

注意,虽然,通过各种可能性会这种方式很可能是完全不可行的可能性的数量将迅速增长。

+0

对不起,你能解释你到底在做什么 'flattened_options = list(chain.from_iterable(lol) )' – Greg

+0

@Greg:在该行后面加上'print(flattened_options)'来查看。基本上它需要列表列表'lol'并将它变成一个平面列表,所以在这里它将'xx'变成'[[10,20,30],[44],[55,66]]'。 – DSM

+0

'from_iterable'是否有函数,或者它只是您使用的通用名称?我可以看到这是我想要的,我只是想了解它,所以它不仅仅是一个黑盒子,而是我想要的。 – Greg