使用 Python 将键分组到值列表
将键分组到值是根据特定属性或标准对数据进行分类的过程。例如,假设您有一个学生数据集,并且您想按他们的成绩对他们进行分组。这种分组使我们能够轻松地对每个类别分别进行分析和计算。在 Python 中,我们可以通过各种方式将键分组到值列表,例如使用字典、defaultdict和itertools.groupby。在本文中,我们将了解如何使用这些方法将键分组到值列表。
方法 1:使用字典
我们可以使用 Python 中的字典轻松地将键分组到值。让我们考虑一个例子,我们有一个水果列表,我们想根据它们的颜色对它们进行分组。
语法
list_name.append(element)
这里,append() 函数是一个列表方法,用于将元素添加到 list_name 的末尾。它通过将指定的元素添加为新项目来修改原始列表。
示例
在下面的例子中,我们迭代水果列表并提取每种水果的颜色。然后我们检查 grouped_fruits 字典中是否已经存在该颜色。如果存在,我们将水果附加到该颜色的现有水果列表中。否则,我们将使用当前水果创建一个新列表并将其分配给相应的颜色。
fruits = [ {"name": "Apple", "color": "Red"}, {"name": "Banana", "color": "Yellow"}, {"name": "Grapes", "color": "Green"}, {"name": "Orange", "color": "Orange"}, {"name": "Blueberry", "color": "Blue"}, {"name": "Strawberry", "color": "Red"}, ] grouped_fruits = {} for fruit in fruits: color = fruit["color"] if color in grouped_fruits: grouped_fruits[color].append(fruit) else: grouped_fruits[color] = [fruit] print(grouped_fruits)
输出
{ 'Red': [{'name': 'Apple', 'color': 'Red'}, {'name': 'Strawberry', 'color': 'Red'}], 'Yellow': [{'name': 'Banana', 'color': 'Yellow'}], 'Green': [{'name': 'Grapes', 'color': 'Green'}], 'Orange': [{'name': 'Orange', 'color': 'Orange'}], 'Blue': [{'name': 'Blueberry', 'color': 'Blue'}] }
方法 2:使用 defaultdict 分组
我们可以使用 Python collections 模块中的 defaultdict 实现更有效的解决方案。defaultdict 会自动为不存在的键初始化一个值,这样我们就无需显式检查和创建列表。
语法
groups = defaultdict(list) groups[item].append(item)
此处,defaultdict(list) 使用 collections 模块中的 defaultdict 类创建一个名为 groups 的类似字典的对象。groups[item].append(item) 将一个项目附加到与 groups 字典中的键项目关联的列表中。通过使用方括号 [] 和 groups[item] 访问字典,如果键项已经存在,则检索现有列表;如果第一次遇到项,则创建一个新的空列表作为值。
示例
在下面的示例中,我们创建一个名为 grouped_fruits 的 defaultdict ,并使用 defaultdict(list) 将其默认值设置为空列表。现在,每当我们访问不存在的键时,它都会自动初始化一个空列表作为值。这简化了分组过程,因为我们不需要单独处理键的存在。
from collections import defaultdict fruits = [ {"name": "Apple", "color": "Red"}, {"name": "Banana", "color": "Yellow"}, {"name": "Grapes", "color": "Green"}, {"name": "Orange", "color": "Orange"}, {"name": "Blueberry", "color": "Blue"}, {"name": "Strawberry", "color": "Red"}, ] grouped_fruits = defaultdict(list) for fruit in fruits: grouped_fruits[fruit["color"]].append(fruit) print(dict(grouped_fruits))
输出
{ 'Red': [{'name': 'Apple', 'color': 'Red'}, {'name': 'Strawberry', 'color': 'Red'}], 'Yellow': [{'name': 'Banana', 'color': 'Yellow'}], 'Green': [{'name': 'Grapes', 'color': 'Green'}], 'Orange': [{'name': 'Orange', 'color': 'Orange'}], 'Blue': [{'name': 'Blueberry', 'color': 'Blue'}] }
方法 3:使用 itertools.groupby 进行分组
我们可以使用 Python itertools 模块中的 groupby 函数轻松地将键分组为值。此函数允许我们根据键函数对可迭代对象中的元素进行分组。
语法
list_name.append(element)
此处,append() 函数是一种列表方法,用于将元素添加到 list_name 的末尾。它通过将指定元素添加为新项目来修改原始列表。
itertools.groupby(iterable, key=None)
此处,groupby() 方法将可迭代对象作为输入,并接受一个可选的键函数。它返回一个迭代器,该迭代器从可迭代对象生成包含连续键和组的元组。键函数用于确定分组标准。
示例
在下面的示例中,我们定义了一个名为 key_function 的键函数,该函数根据奇偶性将数字分类为 "偶数"或"奇数"。然后,我们使用 groupby 根据此键函数对数字进行分组。groupby 函数返回一个迭代器,该迭代器提供键和分组元素的迭代器。我们将迭代器转换为列表,并将其分配为 grouped_numbers 字典中的值。
from itertools import groupby numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] grouped_numbers = {} key_function = lambda x: "Even" if x % 2 == 0 else "Odd" for key, group in groupby(numbers, key_function): grouped_numbers[key] = list(group) print(grouped_numbers)
输出
{'Odd': [9], 'Even': [10]}
结论
在本文中,我们讨论了如何使用 Python 中的不同方法将键分组到值列表。我们从使用字典开始,手动检查键是否存在并创建列表作为值。然后,我们使用 defaultdict,它通过自动初始化不存在键的值来简化分组过程。此外,我们还探索了 itertools.groupby,这是一个功能强大的函数,允许基于键函数进行分组。