2015-06-23 103 views
1

我想将类分配给节点列表,并根据类标记将所有节点分隔成单独的列表。例如,如果我们有以下代码:在Python中减少列表尺寸

#define number of classes 
MaxC=5 
index=[4 4 5 1 4 1 4 5 4 4 3 1 3 3 1 1] 
def indices(index,func): 
    return[v for (v,val) in enumerate(index) if func(val)] 

##Create node classes 
nodeclass=[[],[],[],[],[],[],[],[],[],[]] 
for k in range(0,MaxC): 
    nodeindex=indices(index, lambda p:p==k) 
    nodeclass[k].append([nodeindex]) 

然后我们就会对应每个类的节点索引位置列表的列表:

[[[[]]] [[[3, 5, 11, 14, 15]]] [[[]]] [[[10, 12, 13]]] 
[[[0, 1, 4, 6, 8, 9]]] [] [] [] [] []] 

不过,这一结果产生上列出清单列表上的名单上。当我想遍历节点索引位置时,这在后面的脚本中会变成问题,但是由于迭代器正在接收列表而不是单个元素,因此会收到返回的错误。

TL; DR:有没有一种方法可以更有效地生成这些索引位置,以便我不会收到列表清单?在最坏的情况下,如果这是不可能的,如何压平列表的形式:

[[],[3,5,11,14,15],[],[10,12,13],[0,1,4,6,8,9],[],[],[],[]] 
+0

请问这有帮助吗? http://stackoverflow.com/questions/406121/flattening-a-shallow-list-in-python or this:http://stackoverflow.com/questions/952914/making-a-flat-list-列表不在Python中的列表 –

+0

这是什么? '指数= [4。 4. 5. 1. 4. 1. 4. 5. 4. 4. 3. 1. 3. 3. 1. 1.]'?这不适合Python。 –

+0

@ReutSharabani固定。我从iPython终端复制了读数,并忘记清除这些时间段。 –

回答

2

更改你的最后一行:

nodeclass[k].extend(nodeindex) 

两个额外的列表包装纸你创建正在发生:

  1. indices函数中的列表理解。
  2. [nodeindex]在追加调用中换行。
+0

谢谢。我曾尝试过使用扩展,但返回了一个错误。我不知道为什么我无法弄清楚,但现在它运行没有错误。谢谢一堆! –