关于groupby()的正确用法:python3

2024-09-24 22:26:40 发布

您现在位置:Python中文网/ 问答频道 /正文

直到我到达groupby(iterable, key=None)时,我才发现如何在itertools中应用这些函数,但我马上就看了这个例子,结果发现它不太符合我的要求,于是我在google上进行了研究。我最终找到了一个example;然而,它并没有真正分解到它的制造地感觉。到我的理解是,groupby()子迭代一个排序的iterable?在

我的问题:谁能提供一个更新的python3解释groupby()函数分解成“Barney风格”?在


Tags: key函数none排序风格examplegoogleiterable
1条回答
网友
1楼 · 发布于 2024-09-24 22:26:40

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

但是,您也可以传递一个键函数,使其不仅分组到同一个元素的运行中,而且可以按您指定的某种方式组合成“相同”的元素的运行:

^{pr2}$

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

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

这里我们有很多单元素组,因为即使大小写的更改也被视为组中的差异。在

最后一个例子还显示了一个重要的问题:groupby只对属于同一组的连续元素进行分组。因此,即使我的数据中有许多“a”,但它们并不是全部组合在一起的,因为它们不是连续的。在

在这些示例中,我只是使用list向您展示每个组中的所有内容。实际上,每个项目都是由iterator生成的。这里也有一个潜在的问题,即如果你循环经过一个组,组的内容就会“消失”:

>>> 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!
[]

结果是,自从我们做了next(grouped),我们越过了“a”组,当我们这样做的时候,石斑鱼“忘记”了那个组的东西。这通常不是一个问题,因为通常你会发现你在使用每一组。但是如果您想以后存储一个组,您需要用list创建一个项目列表,而不是仅仅存储_grouper对象。在

通过使用key函数,您可以对所有类型的事物进行有效的分组,但基本思想是相同的:groupby“chunks”按您指定的方式“相同”的项目序列进行分组。在

相关问题 更多 >