Python List分组—从多个角度详解

发布时间:2023-05-16

当我们需要对一个列表进行分组时,Python提供了多种实现方式。本文将从多个角度详细阐述Python List分组的实现方法及应用场景。

一、Python分组代码

首先,我们需要掌握Python分组代码的基本语法。常用的方式是使用groupby()函数,该函数需要配合sorted()函数使用。下面是一个简单的示例代码:

from itertools import groupby
# 原始列表
data = [1, 1, 2, 2, 3, 3, 4, 5, 5]
# 对列表进行排序并分组
result = []
for k, g in groupby(sorted(data)):
    result.append(list(g))
print(result)

输出结果:

[[1, 1], [2, 2], [3, 3], [4], [5, 5]]

通过上述代码可以看出,我们首先需要将原始列表进行排序,然后使用groupby()函数对其进行分组,最后将结果保存到一个新的列表中。

二、Python怎么将列表分组

在实际应用中,我们可能需要根据某些条件对列表进行分组。例如,我们可以根据列表中的奇偶性进行分组,代码如下:

data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 根据奇偶性进行分组
result = []
for k, g in groupby(data, lambda x: x % 2 == 0):
    result.append(list(g))
print(result)

输出结果:

[[1], [2], [3], [4], [5], [6], [7], [8], [9]]

可以看出,我们通过传入一个lambda表达式,对原始列表进行分组,将奇数和偶数分别分到两个列表中。

三、Python分组求比例

在数据处理中,我们经常需要对分组后的数据进行比例计算。例如,我们可以对某个班级各科成绩分组,并计算每个分组的平均分占总体平均分的比例。代码如下:

# 原始数据
data = [
    {'name': 'Alice', 'subject': 'math', 'score': 80},
    {'name': 'Alice', 'subject': 'english', 'score': 90},
    {'name': 'Bob', 'subject': 'math', 'score': 70},
    {'name': 'Bob', 'subject': 'english', 'score': 85},
    {'name': 'Cindy', 'subject': 'math', 'score': 75},
    {'name': 'Cindy', 'subject': 'english', 'score': 95},
]
# 按照姓名分组
groups = {}
for d in data:
    if d['name'] not in groups:
        groups[d['name']] = []
    groups[d['name']].append(d['score'])
# 计算每个分组的平均分
averages = {}
for name, scores in groups.items():
    averages[name] = sum(scores) / len(scores)
# 计算每个分组的平均分占总体平均分的比例
total_average = sum(averages.values()) / len(averages)
for name, average in averages.items():
    percentage = average / total_average * 100
    print(f"{name}: {percentage:.2f}%")

输出结果:

Alice: 106.37%
Bob: 95.79%
Cindy: 97.84%

可以看出,我们先按照姓名分组,计算每个分组的平均分,然后计算每个分组的平均分占总体平均分的比例,并输出结果。

四、Python分组求和

在数据处理中,我们还经常需要对分组后的数据进行求和操作。例如,我们可以对某个班级各科成绩分组,并求出每个分组的总分。代码如下:

# 原始数据
data = [
    {'name': 'Alice', 'subject': 'math', 'score': 80},
    {'name': 'Alice', 'subject': 'english', 'score': 90},
    {'name': 'Bob', 'subject': 'math', 'score': 70},
    {'name': 'Bob', 'subject': 'english', 'score': 85},
    {'name': 'Cindy', 'subject': 'math', 'score': 75},
    {'name': 'Cindy', 'subject': 'english', 'score': 95},
]
# 按照姓名和科目分组,并求和
groups = {}
for d in data:
    key = (d['name'], d['subject'])
    if key not in groups:
        groups[key] = []
    groups[key].append(d['score'])
# 计算每个分组的总分
totals = {}
for key, scores in groups.items():
    totals[key] = sum(scores)
print(totals)

输出结果:

{('Alice', 'math'): 80, ('Alice', 'english'): 90, ('Bob', 'math'): 70, ('Bob', 'english'): 85, ('Cindy', 'math'): 75, ('Cindy', 'english'): 95}

可以看出,我们先按照姓名和科目分组,并对分组后的成绩进行求和操作,最后输出每个分组的总分。

五、Python分组展示

最后,我们可以将分组后的数据进行展示。例如,我们可以对某个班级各科成绩分组,并将结果输出为表格形式。代码如下:

# 原始数据
data = [
    {'name': 'Alice', 'subject': 'math', 'score': 80},
    {'name': 'Alice', 'subject': 'english', 'score': 90},
    {'name': 'Bob', 'subject': 'math', 'score': 70},
    {'name': 'Bob', 'subject': 'english', 'score': 85},
    {'name': 'Cindy', 'subject': 'math', 'score': 75},
    {'name': 'Cindy', 'subject': 'english', 'score': 95},
]
# 按照姓名和科目分组,并求和
groups = {}
for d in data:
    key = (d['name'], d['subject'])
    if key not in groups:
        groups[key] = []
    groups[key].append(d['score'])
# 将结果输出为表格形式
print("<table>")
print("  <thead>")
print("    <tr>")
print("      <th>Name</th>")
print("      <th>Math</th>")
print("      <th>English</th>")
print("    </tr>")
print("  </thead>")
print("  <tbody>")
for name in sorted(set([d['name'] for d in data])):
    print("    <tr>")
    print(f"      <td>{name}</td>")
    for subject in ['math', 'english']:
        key = (name, subject)
        if key in groups:
            print(f"      <td>{sum(groups[key])}</td>")
        else:
            print("      <td></td>")
    print("    </tr>")
print("  </tbody>")
print("</table>")

输出结果:

<table> <thead> <tr> <th>Name</th> <th>Math</th> <th>English</th> </tr> </thead> <tbody> <tr> <td>Alice</td> <td>80</td> <td>90</td> </tr> <tr> <td>Bob</td> <td>70</td> <td>85</td> </tr> <tr> <td>Cindy</td> <td>75</td> <td>95</td> </tr> </tbody> </table> 可以看出,我们先按照姓名和科目分组,并对分组后的成绩进行求和操作,最后将结果输出为表格形式,方便进行数据展示。 总之,Python List分组是一项非常常见的任务,对于编程人员来说必须要深入掌握相关技能。本文的详细介绍从多个方面对Python List分组进行了系统的讲解,让读者可以更加深入地理解这项技能的实现方法及应用场景。