Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中对列表列表中的元素进行分组?_Python_Python 3.x - Fatal编程技术网

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

如何在Python中对列表列表中的元素进行分组?,python,python-3.x,Python,Python 3.x,我正在尝试根据顶点的邻域大小将顶点列表有效地分组/嵌套到顶点列表中 邻域大小是顶点的一个属性v可以通过调用len(v.neights)获得 我的输入是一个未排序的顶点列表。我试图获得的输出应如下所示: [[all vertices with len(v.neighbours) == 1], [... == 2], [... == 4]] 它应该是一个列表列表,其中每个子列表包含具有相同邻域大小的顶点,从小到大排序,没有空列表。我不需要子列表的索引映射到包含顶点的邻域大小 我知道如何通过

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

邻域大小是顶点的一个属性
v
可以通过调用
len(v.neights)
获得

我的输入是一个未排序的顶点列表。我试图获得的输出应如下所示:

[[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)]
此外,我不想将最大邻域大小作为参数传递,而是在分组过程中计算它,我正在寻找一种在分组过程中过滤空列表的方法

我已经研究了更有效的方法来分组顶点,例如使用字典作为中间步骤,但是我还没有产生一个有效的结果

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


提前感谢,如果之前已经发布过,我很抱歉,但我在另一个问题中找不到我要查找的内容。

将输入传递一次,将结果放入中间字典,将字典转换为所需的输出

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])

您可以这样构建它:

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)

你能提供一个输入和输出的例子作为例子吗?