首页  >  文章  >  后端开发  >  如何根据特定键在 Python 中有效地对数据进行分组?可用于此任务的不同方法有哪些?

如何根据特定键在 Python 中有效地对数据进行分组?可用于此任务的不同方法有哪些?

Linda Hamilton
Linda Hamilton原创
2024-10-27 00:29:02796浏览

How do you efficiently group data in Python based on a specific key, and what are the different methods available for this task?

Python Group By

按键对数据进行分组

在 Python 中,按特定键对数据进行分组涉及到基于公共属性来组织项目。这可以通过各种方法来实现,为大型数据集提供有效的解决方案。让我们探索如何有效地对数据进行分组。

使用 defaultdict 的高效分组技术

考虑一个场景,我们有一组数据对,目标是根据它们的类型对它们进行分组。为了实现这一点,我们可以利用 collections.defaultdict 类。它创建一个字典,其中缺失的键会自动使用默认值进行初始化,从而允许我们将项目附加到这些键。

<code class="python">from collections import defaultdict

input = [
    ('11013331', 'KAT'),
    ('9085267', 'NOT'),
    ('5238761', 'ETH'),
    ('5349618', 'ETH'),
    ('11788544', 'NOT'),
    ('962142', 'ETH'),
    ('7795297', 'ETH'),
    ('7341464', 'ETH'),
    ('9843236', 'KAT'),
    ('5594916', 'ETH'),
    ('1550003', 'ETH'),
]

res = defaultdict(list)
for v, k in input:
    res[k].append(v)

print([{ 'type': k, 'items': v } for k, v in res.items()])</code>

输出:

[{'items': ['9085267', '11788544'], 'type': 'NOT'}, {'items': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'], 'type': 'ETH'}, {'items': ['11013331', '9843236'], 'type': 'KAT'}]

使用 itertools.groupby

另一种方法涉及使用 itertools.groupby。该函数需要预先对输入进行排序。它生成指定键的值相同的连续元素组。

<code class="python">import itertools
from operator import itemgetter

sorted_input = sorted(input, key=itemgetter(1))
groups = itertools.groupby(sorted_input, key=itemgetter(1))

print([{ 'type': k, 'items': [x[0] for x in v]} for k, v in groups])</code>
输出:

[{'items': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'], 'type': 'ETH'}, {'items': ['11013331', '9843236'], 'type': 'KAT'}, {'items': ['9085267', '11788544'], 'type': 'NOT'}]
维护字典中的插入顺序

之前Python 3.7,字典不保留插入顺序。为了解决这个问题,可以使用 collections.OrderedDict 来维护键值对的顺序。

<code class="python">from collections import OrderedDict

res = OrderedDict()
for v, k in input:
    if k in res:
        res[k].append(v)
    else:
        res[k] = [v]

print([{ 'type': k, 'items': v } for k, v in res.items()])</code>
但是,在 Python 3.7 及更高版本中,常规字典会保留插入顺序,从而不需要 OrderedDict。

以上是如何根据特定键在 Python 中有效地对数据进行分组?可用于此任务的不同方法有哪些?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn