Mathematica 有两个非常有用的函数,可以根据给定的条件将数组分组为较小数组的列表:Split[] 和 SplitBy[],我需要在 Python3 代码中模拟它们:Split[list,test] 将相邻元素对视为相同,只要对它们应用函数“test”产生 True,SplitBy[list,f] 将列表拆分为由连续元素组成的子列表,这些元素在应用 f 时给出相同的值。因此如果a=[2,3,5,7,11,13,17,19,23,29]Split[a,(#2-#1 [[2,3,5,7],[11,13],[17,19],[23],[29]]和 SplitBy[a,(Mod[#,2]==0)&] 给出:[[2],[3,5,7,11,13,17,19,23,29]]实际上,要拆分的数组可能是一个二维表,并且测试函数可能对各个列中的元素起作用。如何在 Python3 中有效地编码这种行为? 最佳答案 对于您的问题的第一部分,没有快速答案,lenik 已经提供了一个很好的基于 zip 的解决方案,但是 SplitBy 可以使用 groupby 模块 ( doc here ) 的 itertools 函数轻松重现。请注意,每次 key 更改时,groupby 都会插入一个分隔符(~创建一个新组)。所以如果你想要类似 SplitBy 的东西,你必须先根据 key 函数对其进行排序。最后,它会给你这样的东西:>>> def split_by(l, func): groups = [] sorted_l = sorted(l, key=func) for _, g in it.groupby(sorted_l, key=func): groups.append(list(g)) return groups>>> split_by([2,3,5,7,11,13,17,19,23,29], lambda x: x%2)[[2], [3, 5, 7, 11, 13, 17, 19, 23, 29]]使用列表理解的单行版本:splited_by = [list(g) for _, g in it.groupby(sorted(l, key=func), key=func)]我的旧笔记本电脑上的快速 timeit 基准测试: itertools 版本 >>> %timeit split_by([2,3,5,7,11,13,17,19,23,29], lambda x: x%2)8.42 µs ± 92.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) zip 版本 >>> %timeit split_by([2,3,5,7,11,13,17,19,23,29], lambda x: x%2)10.8 µs ± 53.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 尝试/捕获版本 >>> %timeit split_by([2,3,5,7,11,13,17,19,23,29], lambda x: x%2)12.6 µs ± 162 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)关于python - 如何根据邻居之间的给定标准将数组拆分为几个较小的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58537770/
10-13 02:21