Python group-by归约

  • Post category:Python

下面是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对象对应的数据进行分组,每个元素是元组,需要按照第二个元素进行分组。返回每组的结果。可以使用sortedgroupby配合,代码如下:

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']}

可以看到,输出结果是一个字典类型,其中键为字符串长度,值为分组结果列表。