>>> 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']
>>> 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']
>>> 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!
[]
Groupby根据某些用户指定的特征将连续的项目分组在一起。结果迭代器中的每个元素都是一个元组,其中第一个元素(
group
)是“key”,这是该组的标签。第二个元素(在我的例子中是items
)是该组中项目的迭代器。在在最简单的情况下,特征就是身份,这意味着它将同一事物的“运行”组合在一起:
但是,您也可以传递一个键函数,使其不仅分组到同一个元素的运行中,而且可以按您指定的某种方式组合成“相同”的元素的运行:
^{pr2}$这里我使用了一个键函数,它返回其输入的小写形式。这意味着,如果项目的小写形式相同,则对它们进行分组。如果没有键功能,则只有完全相同的项目才会被分组:
这里我们有很多单元素组,因为即使大小写的更改也被视为组中的差异。在
最后一个例子还显示了一个重要的问题:groupby只对属于同一组的连续元素进行分组。因此,即使我的数据中有许多“a”,但它们并不是全部组合在一起的,因为它们不是连续的。在
在这些示例中,我只是使用
list
向您展示每个组中的所有内容。实际上,每个项目都是由iterator生成的。这里也有一个潜在的问题,即如果你循环经过一个组,组的内容就会“消失”:结果是,自从我们做了
next(grouped)
,我们越过了“a”组,当我们这样做的时候,石斑鱼“忘记”了那个组的东西。这通常不是一个问题,因为通常你会发现你在使用每一组。但是如果您想以后存储一个组,您需要用list
创建一个项目列表,而不是仅仅存储_grouper
对象。在通过使用key函数,您可以对所有类型的事物进行有效的分组,但基本思想是相同的:groupby“chunks”按您指定的方式“相同”的项目序列进行分组。在
相关问题 更多 >
编程相关推荐