【问题标题】:Is there any way to use itertools groupby to remove adjacent duplicating items in a list, but keep the original index?有没有办法使用 itertools groupby 删除列表中相邻的重复项,但保留原始索引?
【发布时间】:2020-04-05 22:43:09
【问题描述】:

例如,如果我有一个列表 [1,2,2,3,2,2,1],我想返回带有索引 (0,1,3,4,6) 的 [1,2,3,2,1]

我对 groupby 不熟悉,我学会了如何消除相邻的重复项,但是也可以通过 groupby() 以某种方式提取索引?谢谢你。

【问题讨论】:

    标签: python list indexing itertools


    【解决方案1】:

    是的,有可能,您可以将itertools.groupbyenumerate() 和右边的key= 组合在一起

    例如:

    lst = [1,2,2,3,2,2,1]
    
    from itertools import groupby
    
    rv, index = [], []
    for v, g in groupby(enumerate(lst), key=lambda k: k[1]):
        rv.append(v)
        index.append(next(g)[0])
    
    print(rv)
    print(index)
    

    打印:

    [1, 2, 3, 2, 1]
    [0, 1, 3, 4, 6]
    

    【讨论】:

    • 我无法理解最后一部分 index.append(next(g)[0])。我还尝试获取最后一个重复项的索引,而不是第一个重复项,例如 [0,2,3,5,6],我确实弄明白了,但不明白。 for x in g: continue #outside for loop rv.append(v) index.append(x[0])谢谢。
    • @kuku index.append(next(g)[0]) 从迭代器 gnext(g) 部分)获取第一个值,然后从该值([0] 部分)获取第一个元素并将其附加到列表 @987654331 @。迭代器g 包含来自enumerate(lst) 迭代器的组。本例中的第一组是(0, 1),第二组是(1, 2), (2, 2),第三组是(3, 3),依此类推...使用for x in g: continue,您只需遍历整个组,x 将是该组的最后一个元素。
    • 啊,现在这么有道理,我终于明白了这些组是什么,我完全误解了它。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2020-05-03
    • 2021-05-08
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多