uniq的用例,不进行排序的groupby

问题描述 投票:3回答:1

[调试Python程序时,我最近发现Python itertools#groupby()函数要求对输入集合进行排序,因为它仅将按顺序出现的相同元素分组:

通常,可迭代对象必须已经在相同的键函数上进行了排序。

groupby()的操作类似于Unix中的uniq过滤器

[在两种情况下,uniq和Python的groupby(),我想知道在不进行排序的情况下应用它们的用例可能是什么。

很显然,分类可能很昂贵,应尽可能避免。但是,如果实际上排序实际上是不可避免的,那么为什么Python开发人员决定不将其设为groupby()中的默认值?这似乎在该函数的用户中引起很多confusion

我注意到,这个设计决定似乎并不普遍。像Scala这样的语言似乎在groupBy()函数中隐式地对集合进行排序。

因此,我的问题是:哪些用例导致了关于不对uniq和Python的groupby()进行隐式排序的设计决策?

python sorting grouping uniq
1个回答
0
投票

您可以使用具有内部副作用的理解来对迭代器进行分组,而无需像这样进行排序(并且不使用库):

from random import randrange
source   = ( randrange(20) for _ in range(20) )
getKey   = lambda n: n % 5
grouped, = ([d][any(d.setdefault(getKey(v),[]).append(v) for v in source)] for d in [dict()])

print(grouped)
# {2: [17, 2, 17, 17, 17], 1: [1, 11, 1, 16, 1], 4: [19, 19, 14, 19, 9], 3: [3, 3], 0: [0, 10, 5]}
© www.soinside.com 2019 - 2024. All rights reserved.