如何使用itertools.groupby()获取每个项目的索引和出现

Aou*_*000 4 python zip functional-programming list-comprehension python-itertools

这是我有两个列表的故事:

list_one=[1,2,9,9,9,3,4,9,9,9,9,2]
list_two=["A","B","C","D","A","E","F","G","H","Word1","Word2"]
Run Code Online (Sandbox Code Playgroud)

我想在list_one中找到连续9的指示,以便我可以从list_two获取相应的字符串,我试过:

group_list_one= [(k, sum(1 for i in g),pdn.index(k)) for k,g in groupby(list_one)]
Run Code Online (Sandbox Code Playgroud)

我希望得到每个元组中前9个的索引,然后尝试从那里开始,但那不起作用..

我能在这做什么?PS:我看过itertools的文档,但对我来说似乎很模糊..提前感谢

编辑:预期的输出是(键,出现,index_of_first_occurance)类似的东西

[(9, 3, 2), (9, 4, 7)]
Run Code Online (Sandbox Code Playgroud)

Ste*_*ima 5

根据您的预期输出判断,尝试一下:

from itertools import groupby

list_one=[1,2,9,9,9,3,4,9,9,9,9,2]
list_two=["A","B","C","D","A","E","F","G","H","Word1","Word2"]
data = zip(list_one, list_two)
i = 0
out = []

for key, group in groupby(data, lambda x: x[0]):
        number, word = next(group)
        elems = len(list(group)) + 1
        if number == 9 and elems > 1:
            out.append((key, elems, i))
        i += elems

print out
Run Code Online (Sandbox Code Playgroud)

输出:

[(9, 3, 2), (9, 4, 7)]
Run Code Online (Sandbox Code Playgroud)

但如果你真的想要这样的输出:

[(9, 3, 'C'), (9, 4, 'G')]
Run Code Online (Sandbox Code Playgroud)

那么看看这个片段:

from itertools import groupby

list_one=[1,2,9,9,9,3,4,9,9,9,9,2]
list_two=["A","B","C","D","A","E","F","G","H","Word1","Word2"]
data = zip(list_one, list_two)
out = []

for key, group in groupby(data, lambda x: x[0]):
    number, word = next(group)
    elems = len(list(group)) + 1
    if number == 9 and elems > 1:
        out.append((key, elems, word))

print out
Run Code Online (Sandbox Code Playgroud)

  • 我不知道你是如何破译这个问题的,但这看起来像是一个可靠的答案. (2认同)
  • 微小的错误:它似乎检测到*任何*重复元素的组,而不仅仅是9个. (2认同)