📜  按列表分组python(1)

📅  最后修改于: 2023-12-03 15:10:08.656000             🧑  作者: Mango

按列表分组 Python

在 Python 中,经常需要对列表进行分组操作。本文将介绍不同方法对列表进行分组操作,并对各种方法进行比较和总结。

方法一:使用 for 循环

使用 for 循环最为直观,也是最为灵活的方法,可以同时实现分组和排序操作。

data = [
    {"name": "Tom", "age": 18, "group": "A"},
    {"name": "Jerry", "age": 19, "group": "B"},
    {"name": "Lily", "age": 20, "group": "A"},
    {"name": "Lucy", "age": 21, "group": "B"},
]

result = {}
for item in data:
    if item["group"] not in result:
        result[item["group"]] = []
    result[item["group"]].append(item)

for group, items in result.items():
    print(group)
    for item in items:
        print("  ", item)

输出结果为:

A
   {'name': 'Tom', 'age': 18, 'group': 'A'}
   {'name': 'Lily', 'age': 20, 'group': 'A'}
B
   {'name': 'Jerry', 'age': 19, 'group': 'B'}
   {'name': 'Lucy', 'age': 21, 'group': 'B'}
方法二:使用 itertools.groupby 函数

itertools.groupby 函数是 Python 内置函数,可以方便地对列表进行分组操作。但是需要注意的是,groupby 函数在分组之前需要将列表进行排序。

from itertools import groupby

data = [
    {"name": "Tom", "age": 18, "group": "A"},
    {"name": "Jerry", "age": 19, "group": "B"},
    {"name": "Lily", "age": 20, "group": "A"},
    {"name": "Lucy", "age": 21, "group": "B"},
]

data.sort(key=lambda x: x["group"])

result = {}
for group, items in groupby(data, key=lambda x: x["group"]):
    result[group] = list(items)

for group, items in result.items():
    print(group)
    for item in items:
        print("  ", item)

输出结果与上一方法相同。

方法三:使用 defaultdict 类

使用 defaultdict 类可以避免在进行分组操作时使用 if 判断,所以代码更加简洁。

from collections import defaultdict

data = [
    {"name": "Tom", "age": 18, "group": "A"},
    {"name": "Jerry", "age": 19, "group": "B"},
    {"name": "Lily", "age": 20, "group": "A"},
    {"name": "Lucy", "age": 21, "group": "B"},
]

result = defaultdict(list)
for item in data:
    result[item["group"]].append(item)

for group, items in result.items():
    print(group)
    for item in items:
        print("  ", item)

输出结果与上一方法相同。

比较和总结

以上三种方法对列表进行分组操作的功能基本相同,但是使用 defaultdict 类实现更为简洁,for 循环实现更为灵活。

在性能方面,for 循环实现的方法最为高效,其次是 defaultdict 类实现的方法,最后是 itertools.groupby 函数实现的方法。其中,itertools.groupby 函数的性能比较低,因为它需要在使用之前对列表进行排序操作。

因此,建议选择使用 for 循环实现的方法,既可以实现分组操作,又不会影响性能。如果代码需要更为简洁,可以选择使用 defaultdict 类实现的方法。而使用 itertools.groupby 函数则不推荐,因为它需要进行排序操作,影响性能,并且代码实现较为复杂。