按属性将分区列表划分为子列表

时间:2019-01-10 07:21:59

标签: python

我具有以下分区功能:

def group_by_name(data):
    names = set([entry.name for entry in data])  # detect all possible names
    # and now create a sublist for each possible name
    by_name = [[entry for entry in data if entry.name == name] for name in names]
    return by_name

有没有更多的python方式实现此功能?

编辑

数据:

import random


class Data:
    def __init__(self, name):
        self.name = name

NAMES = [ 'jose', 'pedro', 'antonio', 'jesus', 'ricardo', 'anabel']

data = [Data(random.choice(NAMES)) for _ in range(100)]

2 个答案:

答案 0 :(得分:3)

您的方法是O(N*K),因为您遍历整个列表的次数要多于有不同元素的次数。您可以使用以下方法在一次迭代(O(N))中收集列表。以下模式:

def group_by_name(data):
    d = {}
    for entry in data:
        d.setdefault(entry.name, []).append(entry)
    return list(d.values())

您还可以使用一些工具来使用O(N*logN)单线:

from operator import attrgetter as ag
from itertools import groupby as gb

def group_by_name(data): 
    return [list(g) for _, g in gb(sorted(data, key=ag('name')), key=ag('name'))]

答案 1 :(得分:0)

使用字典并在数据上循环,使用名称作为键,并使用条目列表作为值。然后将每个键的值放入新构造的列表中,然后将其返回。因为这是线性运行时,所以效率更高。

相关问题