Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于groupby()的正确用法:Python 3_Python - Fatal编程技术网

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

关于groupby()的正确用法:Python 3,python,Python,在我找到groupby(iterable,key=None)之前,我对如何在itertools中应用这些函数没有任何疑问。我立即阅读了这个示例,但它并没有让我产生共鸣,这导致我在谷歌上对它进行了研究。我最终找到了一个;然而,它并没有真正将它分解到有意义的地方 我的问题:有人能提供一个更新的Python 3,解释一下分解为“Barney风格”的groupby()函数吗?groupby根据一些用户指定的特征将连续项分组在一起。结果迭代器中的每个元素都是一个元组,其中第一个元素(group,在我的示例

在我找到
groupby(iterable,key=None)
之前,我对如何在itertools中应用这些函数没有任何疑问。我立即阅读了这个示例,但它并没有让我产生共鸣,这导致我在谷歌上对它进行了研究。我最终找到了一个;然而,它并没有真正将它分解到有意义的地方


我的问题:有人能提供一个更新的Python 3,解释一下分解为“Barney风格”的
groupby()
函数吗?

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']
但是,您也可以传递一个键函数,以便不仅将同一元素的运行分组,而且将以某种方式指定为“相同”的元素的运行分组:

>>> 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']
这里我使用了一个键函数,它返回输入的小写形式。这意味着,如果项目的小写形式相同,则对其进行分组。如果没有键功能,则仅当项目完全相同时才会对其进行分组:

>>> 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
向您展示了每组中的所有内容。但实际上,每个组都是一个迭代器,因此只在需要时生成项目。这里也有一个潜在的问题,如果你迭代一个组,该组的内容就会“消失”:

>>> 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!
[]
>>grouped=itertools.groupby('aabbbccdddee')
>>>分组,项目=下一个(分组)
>>>打印组,项目#“_grouper”对象是组“a”中项目的迭代器
A.
>>>下一组#我们转到下一组
(u'b',)
>>>打印列表(项目)#哎呀,项目消失了!
[]
发生的事情是,因为我们做了
下一个(分组)
,我们移动到“a”组,当我们这样做时,石斑鱼“忘记”了该组中的内容。这通常不是一个问题,因为通常你会发现你在使用每一组时都是正确的。但是,如果您想为以后存储组,则需要使用
list
创建项目列表,而不仅仅是存储
\u grouper
对象


通过使用key函数,您可以有效地对各种事情进行分组,但基本思想是相同的:groupby“chunk”按您指定的方式对“相同”的项目序列进行分组。

删除了我的答案,因为这有更好的示例。关于这一点,文档中还指出您的集合应该按键函数排序:“通常,iterable需要已经按同一键函数排序。”@BurhanKhalid:是的,如果您希望将具有相同键的所有项分组在一起。不过,在某些情况下,您可能需要连续运行项目。我喜欢发现新的模块(它们对我来说是新的,因为我还没有学会每个模块),然后学习如何应用每个功能。如果有很多问题是我提出的,那么可以放心地假设我在提问之前已经做了一些研究。我只在检查过谷歌、函数、文档以及函数模块下给出的示例后才发布问题。