uniq、groupby 的用例,无需排序

Car*_*ten 5 python sorting grouping uniq

在调试Python程序时,我最近发现Python itertools#groupby()函数需要对输入集合进行排序,因为它只对序列中出现的相同元素进行分组:

一般来说,可迭代对象需要已经在相同的键函数上进行排序。

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

在这两种情况下,uniq以及 Python 的情况groupby()下,我想知道在不排序的情况下应用这些的用例可能是什么。

显然,排序的成本可能很高,因此应尽可能避免。然而,如果排序在实践中显然是不可避免的,那么为什么 Python 开发人员决定不将其设为默认值呢groupby()?这似乎给该功能的用户造成了很多困惑。

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

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

Ala*_* T. 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]}
Run Code Online (Sandbox Code Playgroud)