如何在Python的列表列表中对元素进行分组?

时间:2019-03-31 18:09:14

标签: python python-3.x

我正在尝试根据邻域的大小有效地将顶点列表分组/嵌套到顶点列表中。

邻域大小是顶点v的属性,可以通过调用len(v.neighbours)获得。

我的输入是未排序的顶点列表。我尝试获取的输出应如下所示:

[[all vertices with len(v.neighbours) == 1], [... == 2], [... == 4]]    

应该是列表的列表,其中每个子列表包含具有相同邻域大小的顶点,从小到大排序,没有空列表。我不需要子列表的索引来映射到所包含顶点的邻域大小。

我知道如何通过列表理解来实现这一点,但是效率很低:

def _group(V: List[Vertex], max: int) -> List[List[Vertex]]:
    return [[v for v in V if v.label == i] for i in range(max)]

此外,我不想将最大邻域大小作为参数传递,而是在分组期间进行计算,并且我也在寻找一种在分组期间过滤掉空白列表的方法。

我已经研究了将顶点分组的更有效方法,例如,通过使用字典作为中介步骤,但是我没有设法产生工作结果。

有人可以告诉我最有效的分组/嵌套顶点列表的方法吗?

在此先感谢您,如果在此之前发布过,很抱歉,但是在另一个问题中我找不到我想要的东西。

2 个答案:

答案 0 :(得分:3)

一次通过输入,将结果放入中间字典中,将字典工作到所需的输出中。

temp_result = defaultdict(list)

for v in vertices:
    temp_result[neighborhood_size(v)].append(v)

max_size = max(temp_result.keys())

return_val = list()
for i in range(max_size):
    if temp_result[i]: # check if empty
        return_val.append(temp_result[i])

答案 1 :(得分:0)

您可以通过以下方式构建它:

from collections import defaultdict

# Create a dict {nb_of_neighbours:[corresponding vertices]}
vertices_by_neighbours = defaultdict(list)
for v in vertices:
    vertices_by_neighbours[len(v.neighbours)].append(v)

# Create the output list, sorted by number of neighbours    
out = []
for nb_neighbours in sorted(vertices_by_neighbours):
    out.append(vertices_by_neighbours[nb_neighbours])

# Max number of neighbours, in case you want it...
max_neighbours = max(vertices_by_neighbours)