下面是Python中group-by归约函数的使用方法的完整攻略。
groupby函数
groupby
函数是Python标准库itertools
中的一部分。它的作用是将一个序列按照指定的键值分组,返回的结果是一个字典,其中键为指定的键值,值为对应键值的分组结果。该函数的定义如下:
groupby(iterable, key=None)
其中iterable
参数表示输入的序列,key
参数用于制定分组的关键字,如果不指定,则默认使用序列中的每个元素作为关键字。
使用方法
基本用法
对于一个简单的列表,我们可以使用groupby
函数对其中的元素进行分组。例如:
from itertools import groupby
data = [1, 1, 2, 3, 3, 3]
groups = groupby(data)
for key, group in groups:
print(key, list(group))
执行结果为:
1 [1, 1]
2 [2]
3 [3, 3, 3]
其中,key
为分组关键字,group
为分组的结果,它是一个迭代器,通过list
函数可以转化为列表。
指定分组关键字
在上面的例子中,groupby
默认使用元素本身作为关键字进行分组。如果想要自定义关键字,则可以通过key
参数进行指定。例如:
from itertools import groupby
data = ['apple', 'banana', 'china', 'dog', 'egg', 'fan']
groups = groupby(data, key=lambda x: x[0])
for key, group in groups:
print(key, list(group))
执行结果为:
a ['apple']
b ['banana']
c ['china']
d ['dog']
e ['egg']
f ['fan']
在这个例子中,我们使用了一个lambda
表达式作为分组关键字,以获取每个元素的首字母,并以此为依据进行分组。
返回字典类型
除了上述例子中通过循环输出分组结果,groupby
函数还支持返回字典类型的分组结果。例如:
from itertools import groupby
data = ['apple', 'banana', 'china', 'dog', 'egg', 'fan']
groups = groupby(data, key=lambda x: x[0])
result = {key: list(group) for key, group in groups}
print(result)
执行结果为:
{'a': ['apple'], 'b': ['banana'], 'c': ['china'], 'd': ['dog'], 'e': ['egg'], 'f': ['fan']}
可以看到,返回的结果是一个字典类型,其中键为分组关键字,值为分组结果列表。
示例说明
示例一
对一个List对象对应的数据进行分组,每个元素是元组,需要按照第二个元素进行分组。返回每组的结果。可以使用sorted
与groupby
配合,代码如下:
from itertools import groupby
data = [('apple', 3), ('banana', 2), ('cherry', 4), ('date', 2), ('eggfruit', 1), ('fig', 1)]
data = sorted(data, key=lambda x:x[1]) # 先根据第二个元素升序排序
for key, group in groupby(data, key=lambda x:x[1]): # 按照第二个元素进行分组
print(key)
for item in group:
print(item)
输出结果为:
1
('eggfruit', 1)
('fig', 1)
2
('banana', 2)
('date', 2)
3
('apple', 3)
4
('cherry', 4)
示例二
对一个字符串列表进行分组,需要按照长度进行分组,并返回每组的结果。代码如下:
from itertools import groupby
data = ['apple', 'banana', 'cherry', 'date', 'eggfruit', 'fig']
groups = groupby(data, key=lambda x:len(x)) # 按照字符串长度进行分组
result = {key:list(group) for key, group in groups} # 返回字典类型的分组结果
print(result)
输出结果为:
{5: ['apple', 'cherry'], 6: ['banana', 'eggfruit'], 4: ['date'], 3: ['fig']}
可以看到,输出结果是一个字典类型,其中键为字符串长度,值为分组结果列表。