我已经组装了一些代码,可以从各种SO帖子中提取出我想要的内容,但我不太确定它是如何工作的。想知道是否有人能帮我节省一些时间和ELI5是如何工作的。
列出可以或不连续的数字:
from itertools import groupby
from operator import itemgetter
list_of_num = [1,3,4,5,6,10,11,13,15,17,18]
for _, value in groupby(enumerate(list_of_num), lambda i_x: i_x[0] - i_x[1]):
collapsed_nums = map(itemgetter(1), value)每次迭代的输出是: 1,3,4,5,6,10,11,13,15,17,18
如何组合lambda函数和枚举来产生这个输出?
发布于 2018-09-25 00:56:05
通过查看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] --这是一个函数,它接受一个或多个元素序列,并返回前两个元素之间的差异。假设您要将enumerate的输出传递给它,它总是列表中的数字与其在列表中的位置之间的区别。把它们放在一起--连续的数字将有一个恒定的值来表示数字和它在列表中的位置之间的差异,因此,枚举一个数字列表,然后根据该差异进行分组,将序列数的运行组合在一起。
发布于 2018-09-25 00:53:40
查看您的列表、它的枚举以及它们之间的差异(这是您的关键功能度量)。
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)这就是关键功能所做的一切。因为枚举总是增加1,如果值也增加了1,那么值和索引之间的差异将保持不变,这意味着groupby将将这些项组合在一起。
https://stackoverflow.com/questions/52489079
复制相似问题