ELI5 Python groupby代码“折叠”连续数字

时间:2018-09-25 00:42:21

标签: python

我已经汇编了一些代码,这些代码可以完成我从各种SO帖子中提取的内容,但是我不确定它是如何工作的。想知道是否有人可以为我节省时间和ELI5的工作方式。

给出可能不连续的数字列表:

sapply(strsplit(m.v, "~"), "[[", 1)
[1] "Aert" "Aert" "Aert" "Aert" "Aert" "Aert" "Aert" "Aert" "Aert"

每次迭代的输出为:[1],[3、4、5、6],[10,11],[13],[15],[17,18](如果从map转换为list )

lambda函数和枚举的组合如何共同产生此输出?

2 个答案:

答案 0 :(得分:3)

您可以通过查看groubpy键的输入和输出来了解其工作原理:

list_of_num = [1,3,4,5,6,10,11,13,15,17,18]

>>> for i_x in enumerate(list_of_num):
 ...:     print((i_x, i_x[0] - i_x[1]))
 ...:     
((0, 1), -1)
((1, 3), -2)
((2, 4), -2)
((3, 5), -2)
((4, 6), -2)
((5, 10), -5)
((6, 11), -5)
((7, 13), -6)
((8, 15), -7)
((9, 17), -8)
((10, 18), -8)

打破现状:

  • enumerate(list_of_num)-这是一个可迭代的过程,它将发出该项目在列表中的位置的元组,然后是值本身

  • groupby(..., lambda i_x: i_x[0] - i_x[1])-groupby进行迭代,并将顺序元素组合在一起,其中键(第二个参数)返回相同的值。

  • lambda i_x: i_x[0] - i_x[1]-此函数接受2个或更多元素序列,并返回前两个元素之间的差。假设您要向其传递enumerate的输出,那么列表中的数字与其在列表中的位置始终是差异。

将所有内容放在一起-连续的数字对于数字与其在列表中的位置之间的差异将具有一个恒定值,因此对数字列表进行枚举,然后按该差异进行分组会将连续的数字分组在一起。 / p>

答案 1 :(得分:1)

查看您的列表,其枚举及其区别(这是您的关键功能所衡量的)

 0  1  2  3  4  5   6   7   8   9   10   # indices
[1, 3, 4, 5, 6, 10, 11, 13, 15, 17, 18]  # list
 1  2  2  2  2  5   5   6   7   8   8    # difference (key function value)

这是关键功能正在做的所有事情。因为枚举总是增加一,所以如果值也增加一,则值和索引之间的差将保持不变,这意味着groupby将把这些项组合在一起。