关于groupby()的正确用法:Python 3

Tim*_*yne 4 python

我没有任何问题想出如何在itertools中应用函数直到我到达 groupby(iterable, key=None),我立即阅读了这个例子并且它没有完全点击我,这导致我在谷歌上研究它.我最终找到了一个例子 ;然而,它并没有真正将它分解为有意义的地方.根据我的理解,groupby()子迭代一个有序的迭代?

我的问题:任何人都可以提供更新的Python 3,解释groupby()"Barney-Style"的功能吗?

Bre*_*arn 7

Groupby根据用户指定的特征将连续项组合在一起.生成的迭代器中的每个元素都是一个元组,其中第一个元素(group在我的示例中)是"key",它是该组的标签.第二个元素(items在我的示例中)是该组中项目的迭代器.

在最简单的情况下,特征就是身份,这意味着它将同一组的"运行"组合在一起:

>>> for group, items in itertools.groupby('aabbbccdddee'):
...     print group, list(items)
a [u'a', u'a']
b [u'b', u'b', u'b']
c [u'c', u'c']
d [u'd', u'd', u'd']
e [u'e', u'e']
Run Code Online (Sandbox Code Playgroud)

但是,您也可以将键函数传递给组,而不仅仅是组成相同元素的运行,而是以您指定的某种方式运行"相同"的元素:

>>> for group, items in itertools.groupby('aaAaAAbBbcCdDdDeE', lambda x: x.lower()):
...     print group, list(items)
a [u'a', u'a', u'A', u'a', u'A', u'A']
b [u'b', u'B', u'b']
c [u'c', u'C']
d [u'd', u'D', u'd', u'D']
e [u'e', u'E']
Run Code Online (Sandbox Code Playgroud)

这里我使用了一个键函数,它返回其输入的小写形式.这意味着如果项目的小写形式相同,则会对项目进行分组.如果没有关键功能,只有在完全相同的情况下才会对项目进行分组:

>>> for group, items in itertools.groupby('aaAaAAbBbcCdDdDeE'):
...     print group, list(items)
a [u'a', u'a']
A [u'A']
a [u'a']
A [u'A', u'A']
b [u'b']
B [u'B']
b [u'b']
c [u'c']
C [u'C']
d [u'd']
D [u'D']
d [u'd']
D [u'D']
e [u'e']
E [u'E']
Run Code Online (Sandbox Code Playgroud)

在这里,我们有很多单元素组,因为即使案例中的变化也算作组中的差异.

最后一个示例还显示了一个重要的问题:groupby仅对属于同一组的连续元素进行分组.因此,尽管我的数据中有很多"a",但它们并非全部组合在一起,因为它们不是连续的.

在这些例子中,我只是用来list向你展示每组中的所有内容.实际上,每个组都是一个迭代器,因此只能根据需要生成项目.这里也存在潜在的问题,因为如果你遍历那个组,组的内容会"消失":

>>> grouped = itertools.groupby('aabbbccdddee')
>>> group, items = next(grouped)
>>> print group, items   # the "_grouper" object is an iterator of items in group "a"
a <itertools._grouper object at 0x0000000002648DA0>
>>> next(grouped)   # we move to the next group
(u'b', <itertools._grouper object at 0x0000000002648630>)
>>> print list(items)   # oops, items vanished!
[]
Run Code Online (Sandbox Code Playgroud)

发生了什么事情,因为我们这样做了next(grouped),我们移过了"a"组,当我们这样做时,石斑鱼"忘记了"那个组中的内容.这通常不是问题,因为通常你会发现你正确使用每个组.但是如果你想稍后存储一个组,你需要创建一个项目列表,list而不是只存储该_grouper对象.

通过使用键功能,您可以对各种事物进行分组,但基本思路是相同的:groupby"chunks"项目序列,以您指定的方式"相同".