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

标签 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

有没有更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/

相关文章:

python - 如何在 Python 中找到与谓词匹配的序列中的第一个元素?

带别名的 Python switch 语句

python - 小写列表列表

python - 在 Python 中对字符串进行 URL 编码和解码

python - 仅为当前模块从 python 调用 pytest

Python 程序不记得变量

python - Google colab 文件下载失败获取错误

python - 更改 pandas 数据框中的日期格式

python - 如何有效地在具有不同维度的多维 numpy 数组中添加列?

Python脚本负载测试网页