我具有以下分区功能:
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)]
答案 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)
使用字典并在数据上循环,使用名称作为键,并使用条目列表作为值。然后将每个键的值放入新构造的列表中,然后将其返回。因为这是线性运行时,所以效率更高。