gpt4 book ai didi

python - 按属性将列表划分为子列表

转载 作者:行者123 更新时间:2023-11-30 22:01:09 25 4
gpt4 key购买 nike

我有以下分区函数:

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

有没有更Pythonic的方式来实现这个功能?

编辑

数据:

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

最佳答案

您的方法是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'))]

关于python - 按属性将列表划分为子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54123666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com