按共享属性的值对序列中的项目进行分组。
项目描述
按共享属性的值对序列中的项目进行分组。
group_by_attr(attr, items)
安装:
$ pip install group-by-attr
例子
假设您想将一些“结构”实例组合在一起。
>>> from pprint import pprint
>>> from collections import namedtuple
>>> Struct = namedtuple('Struct', ('x', 'y', 'z'))
>>> a, b, c = (
... Struct(x=1, y=1, z=1),
... Struct(x=1, y=2, z=2),
... Struct(x=1, y=1, z=3))
如果我们通过“x”属性对这些实例进行分组,我们应该期望一个包含所有三个项目的组:
>>> pprint(group_by_attr(attr='x', items=(a, b, c)))
{1: (Struct(x=1, y=1, z=1),
Struct(x=1, y=2, z=2),
Struct(x=1, y=1, z=3))}
相反,如果我们要按“y”分组,我们应该期待不同的分组:
>>> pprint(group_by_attr(attr='y', items=(a, b, c)))
{1: (Struct(x=1, y=1, z=1),
Struct(x=1, y=1, z=3)),
2: (Struct(x=1, y=2, z=2),)}
最后,按“z”分组将产生三个单独的组:
>>> pprint(group_by_attr(attr='z', items=(a, b, c)))
{1: (Struct(x=1, y=1, z=1),),
2: (Struct(x=1, y=2, z=2),),
3: (Struct(x=1, y=1, z=3),)}
该函数也可以使用替代的 getattr,只要它实现相同的接口(将项目和属性名称作为参数)。例如,您可以对字典进行分组:
>>> pprint(group_by_attr(
... attr='x',
... items=(
... {'x': 1, 'y': 'a'},
... {'x': 2, 'y': 'b'},
... {'x': 1, 'y': 'c'}),
... getattr_fn=dict.__getitem__))
{1: ({'x': 1, 'y': 'a'},
{'x': 1, 'y': 'c'}),
2: ({'x': 2, 'y': 'b'},)}