Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Python uniq、groupby(无排序)的用例_Python_Sorting_Grouping_Uniq - Fatal编程技术网

Python uniq、groupby(无排序)的用例

Python uniq、groupby(无排序)的用例,python,sorting,grouping,uniq,Python,Sorting,Grouping,Uniq,在调试Python程序时,我最近发现Python函数要求对输入集合进行排序,因为它只对序列中出现的相同元素进行分组: 通常,iterable需要已经在同一个键函数上排序 groupby()的操作类似于Unix中的uniq筛选器 在这两种情况下,uniq和Python的groupby(),我想知道在不排序的情况下应用它们的用例是什么 显然,分拣可能很昂贵,应尽可能避免。然而,如果排序在实践中显然是不可避免的,那么为什么Python开发人员决定不在groupby()中将其作为默认值?这似乎在该功能的

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

通常,iterable需要已经在同一个键函数上排序

groupby()的操作类似于Unix中的uniq筛选器

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

显然,分拣可能很昂贵,应尽可能避免。然而,如果排序在实践中显然是不可避免的,那么为什么Python开发人员决定不在
groupby()
中将其作为默认值?这似乎在该功能的用户中引起了很多争议

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


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

您可以使用具有内部副作用的理解在迭代器上分组,而不进行排序(也不使用库),如下所示:

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

需要注意的一点是,您不能对无限输入进行排序(或以其他方式在线生成整个组),这两种输入都是
uniq
itertools.groupby
接受的。正如Ry所说的那样。。。您还将失去对连续数据进行分组的能力。。。例如,将:
[1,1,1,0,0,1,1,0,0,0]
更改为类似于
[(1,3)、(0,2)、(1,2)、(0,3)]
。。。如果
groupby
要明确排序该数据。。。我不可能得到我想要的结果。。。如果没有这样的假设,则由开发人员对其进行排序/执行任何操作,以确保分组发生……因为排序可能在代码中的其他位置进行,或者您的iterable已经按照默认/定义进行了排序,如
列表(范围(10))
。在这些情况下,
groupBy()
不需要浪费时间对已经排序的内容进行排序,也不需要检查是否已排序。除了关于Scala的备注之外,它在分组之前进行排序:Scala在
迭代器上也没有
groupBy()
函数,这样就排除了无限集合: