首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有办法使用itertools groupby删除列表中相邻的重复项,但保留原始索引?

是的,可以使用itertools.groupby来删除列表中相邻的重复项,并保留原始索引。itertools.groupby函数可以将相邻的元素分组,并返回一个迭代器,其中每个元素都是一个键和一个迭代器,迭代器包含相同的键的元素。

下面是一个示例代码,演示如何使用itertools.groupby来实现这个功能:

代码语言:txt
复制
from itertools import groupby

def remove_duplicates_with_index(lst):
    result = []
    for key, group in groupby(enumerate(lst), lambda x: x[1]):
        indices = [index for index, _ in group]
        result.append(lst[indices[0]])
    return result

# 示例用法
lst = [1, 1, 2, 3, 3, 3, 4, 5, 5]
result = remove_duplicates_with_index(lst)
print(result)  # 输出: [1, 2, 3, 4, 5]

在上面的示例中,remove_duplicates_with_index函数接受一个列表作为输入,并使用enumerate函数为列表中的每个元素添加索引。然后,使用itertools.groupby函数将相邻的重复元素分组。最后,我们提取每个分组的第一个索引,并根据索引从原始列表中获取对应的元素,将其添加到结果列表中。

这种方法可以删除列表中相邻的重复项,并保留原始索引。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一日一技:pandas ,如何分组再取 N

摄影:产品经理 还在吃火锅 在 pandas ,DataFrame 是我们经常用到工具。有时候,我们可能会需要对数据按某个字段进行分组,然后每个组取N。例如: 现在,我想每个职位任取三个用户。...相信有同学会使用 for 循环,依次循环每一行,每个职位选3个,存入一个临时列表里面。循环完成以后再转成一个新 DataFrame。这个方式显然不够智能。...那么,我们有没有什么办法能够不使用循环就做到这一步呢?也许有同学想到了使用 groupby。我们来看看效果。 看起来仅仅是统计了每个职位数量。那么,如何才能保留所有字段呢?...如下图所示: 这段话告诉我们,要使用itertools.groupby,我们需要提前对被分组字段进行排序。...那么,我们试一试在如果提前对 DataFrame 进行排序,然后再 groupby 会怎么样: 成功了。每个职位都取了3个。 可能大家发现最左边索引是乱序,看起来不好看。

63810

使用 Python 对相似索引元素上记录进行分组

在 Python ,可以使用 pandas 和 numpy 等库对类似索引元素上记录进行分组,这些库提供了多个函数来执行分组。基于相似索引元素记录分组用于数据分析和操作。...第二行代码使用键()访问组字典与该键关联列表,并将该项追加到列表。 例 在下面的示例,我们使用了一个默认词典,其中列表作为默认值。....groupby() Python itertools 模块提供了一个 groupby() 函数,该函数根据键函数对可迭代对象元素进行分组。...语法 list_name.append(element) 在这里,append() 函数是一个列表方法,用于将元素添加到list_name末尾。它通过将指定元素添加为新来修改原始列表。...例 在下面的示例,我们使用itertools 模块 groupby() 函数。在应用 groupby() 函数之前,我们使用 lambda 函数根据日期对事件列表进行排序。

19330

Python标准库笔记(10) — itertools模块

它们目的是快速有效地使用内存,并且将它们关联在一起以表示更复杂基于迭代算法。 基于迭代器代码比使用列表代码提供了更好内存消耗特性。...除了 itertools 定义函数之外,本文中示例还使用了一些内置函数进行迭代。...,用于通过索引返回输入迭代器指定。...在第二个例子,函数将从两个单独迭代器获取两个参数相乘,并返回一个包含原始参数和计算值元组。第三个例子,在生成了两个元组之后便停止了,因为第二个输入已经耗尽。...# OutPut ('a', 'b') ('a', 'c') ('b', 'c') 因为 combination() 不重复单个输入元素,考虑有时需要包含重复元素组合。

1.7K60

Python语言精华:Itertools

我们可以使用Itertools模块来丰富我们应用程序,并在更短时间内创建一个可靠工作解决方案。 本文将帮助读者理解如何在项目中使用Itertools模块。...它有一个__getitem__方法,它可以从0开始取连续索引(并在索引不再有效时引发一个IndexError)。 什么是Itertools?...或者,也许我们想要重复迭代器元素? itertools库提供了一组函数,我们可以使用这些函数来执行所需所有功能。 本节列出三个函数构造并返回可以是无限迭代器。...如果我们不提供第二个参数,那么它将无限次重复这个字符串。 终止迭代器 在本节,我将说明终止迭代强大特性。...或者当我们有很多函数想要对iterable每个元素执行时 或者有时我们就从迭代器删除元素,然后对其他元素执行操作。

88720

python对list去重多种方法

) for k, g in it: print k 关于itertools.groupby原理可以看这里:(1) http://docs.python.org/2/library/itertools.html...去列表去重,不改变原来顺序,还可以使用一个空列表把原列表里面不重复数据”装起来”,例如: list2 = [] list1 = [1,2,3,2,2,2,4,6,5] for i in list1:...if i not in list2: list2.append(i) list2 [1, 2, 3, 4, 6, 5] 或者使用删除元素索引方法对列表去重,并且不改变原列表顺序...# python for删除时候会往前移(垃圾回收机制),未遍历到后一个占了前一个被删除"位置",导致这个数不会被遍历到,而使最后结果错误 # 局部变量在栈内存存在,当for循环语句结束,那么变量会及时被...# 所以使用while循环删除numsVal(下标) nums = [1,2,3,3,4,2,3,4,5,6,1] val = 3 while val in nums: nums.pop

1.3K30

Leetcode 【583、809、816】

Expressive Words 解题思路: 这道题是给一个字符串S和一个单词数组,S是数组单词通过重复某些字符至少三次得到,找到符合单词。...保存在列表;然后,判断S分割能否被 word 分割一一对应上。...如果两个列表长度不对应,说明不满足题意,终止判断; 如果对应字符不相等或者word某字符长度大于S对应字符长度,说明不满足题意,终止判断; 如果word某字符长度等于S对应字符长度,继续判断...将字符串分割可以利用 Python itertools groupby 函数,用法是: base = [(x[0], len(list(x[1]))) for x in groupby("...这道题做法很朴素,可以先保存所有的分割情况到列表,其中包括非法坐标,然后再将非法坐标从列表删除即可。编程时要注意考虑到所有非法情况。

57520

这段代码很Pythonic | 相见恨晚 itertools

itertools库 迭代器(生成器)在Python是一种很常用也很好用数据结构,比起列表(list)来说,迭代器最大优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python...3map,filter等操作返回不再是列表而是迭代器。...话虽这么说大家平时用到迭代器大概只有range了,而通过iter函数把列表对象转化为迭代器对象又有点多此一举,这时候我们今天主角itertools就该上场了。...使用itertools itertools函数大多是返回各种迭代器对象,其中很多函数作用我们平时要写很多代码才能达到,而在运行效率上反而更低,毕竟人家是系统库。...] itertools.combinations 求列表或生成器中指定数目的元素不重复所有组合 >>> x = itertools.combinations(range(4), 3) >>> print

56730

Python常用小技巧总结

others Python合并多个EXCEL工作表 pandasSeries和Dataframe数据类型互转 相同字段合并 Python小技巧 简单表达式 列表推导式 交换变量 检查对象使用内存情况...合并字典 字符串分割成列表 字符串列表创建字符串 Python查看图片 itertools模块combinations itertoolsreduce 字典.get()方法 解压zip压缩包到指定文件路径...] # 返回第⼀列第⼀个元素 df.loc[0,:] # 返回第⼀⾏(索引为默认数字时,⽤法同df.iloc),需要注意是loc是按索引,iloc参数只接受数字参数 df.ix[[:5],[...对象⾮空值,并返回⼀个Boolean数组 df.dropna() # 删除所有包含空值⾏ df.dropna(axis=1) # 删除所有包含空值列 df.dropna(axis=1,thresh...模块combinations combinations(iterable, r)方法可以创建一个迭代器,返回iterable中所有长度为r子序列,返回子序列按输入iterable顺序排序。

9.4K20

相见恨晚 Python 内置库:itertools

02 itertools库 迭代器(生成器)在Python是一种很常用也很好用数据结构,比起列表(list)来说,迭代器最大优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python...3map,filter等操作返回不再是列表而是迭代器。...话虽这么说大家平时用到迭代器大概只有range了,而通过iter函数把列表对象转化为迭代器对象又有点多此一举,这时候我们今天主角itertools就该上场了。...03 使用itertools itertools函数大多是返回各种迭代器对象,其中很多函数作用我们平时要写很多代码才能达到,而在运行效率上反而更低,毕竟人家是系统库。...] itertools.combinations求列表或生成器中指定数目的元素不重复所有组合 >>> x = itertools.combinations(range(4), 3) >>> print

62620

这段代码很Pythonic | 相见恨晚 itertools

itertools库 迭代器(生成器)在Python是一种很常用也很好用数据结构,比起列表(list)来说,迭代器最大优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python...3map,filter等操作返回不再是列表而是迭代器。...话虽这么说大家平时用到迭代器大概只有range了,而通过iter函数把列表对象转化为迭代器对象又有点多此一举,这时候我们今天主角itertools就该上场了。...使用itertools itertools函数大多是返回各种迭代器对象,其中很多函数作用我们平时要写很多代码才能达到,而在运行效率上反而更低,毕竟人家是系统库。...] itertools.combinations 求列表或生成器中指定数目的元素不重复所有组合 >>> x = itertools.combinations(range(4), 3) >>> print

54630

Python进阶:设计模式之迭代器模式

使用迭代器模式,可以不关心遍历对象具体是什么(如字符串、列表、字典等等),也不需要关心遍历实现算法是什么,它关心是从容器遍历/取出元素结果。...list 是可迭代对象(Iterable),并不是迭代器(虽然在底层实现时用了迭代器部分思想)。...以上方法,比较常用有:chain() 将多个可迭代对象(可以是不同类型)连接成一个大迭代器;compress() 方法根据真假过滤器筛选元素;groupby() 把迭代器相邻重复元素挑出来放在一起...注意:众所周知,Python 序列索引值从 0 开始,但是,enumerate() 可以达到改变起始索引数值效果。...,遍历可迭代对象执行判断函数,过滤下判断为True 元素,与它相对,若想保留判断为 False 元素,可使用 itertoole 模块 filterfalse() 方法。

63540

pandas每天一题-题目19:炸列操作多种方式

一个订单会包含很多明细,表每个样本(每一行)表示一个明细 order_id 列存在重复 item_name 是明细物品名 前面章节讲解过知识点,本文不再讲解!...,然后对列做 explode 注意返回结果索引,这能给出另一种解法提示 ---- 重排索引 很不幸,如果你使用比较旧版本 pandas,怎么办?...实际就是有一个 列表,里面的元素都是列表,怎么展平成一个列表: from itertools import chain list(chain.from_iterable([[1,2,3],[4,5]]...reindex 可以重复多行数据: df.reindex([0,0,1,1,2,2,3,3]) reindex 中指定是行索引列表 怎么知道每个订单需要拆分行数: dfx = df.assign...explode 一样结果 总结: itertools.chain 展开 list list numpy.repeat 重复生成指定次数数据 DataFrame.reindex 按指定行索引值,

57020

53个技巧!老司机熬夜总结Python 实用和高性能技巧大集合!

,(浅)复制元素是原列表中元素别名,而深层复制是递归进行复制,对深层复制修改不影响原变量。...) # 如果找不到抛出ValueError异常 1.7 List 后向索引 这个只是习惯问题,前向索引时下标从0开始,如果反向索引也想从0开始可以使用~。...会保留 2.9 文件路径拼接 C/C++ 习惯通常直接用 + 将路径拼接,这很容易出错,Python os.path.join 会自动根据操作系统不同补充路径之间 / 或 \ 分隔符: import...会无参数调用type,给dict[key]提供一个初始值 3.5 有序 Dict import collections collections.OrderedDict(items=None) # 迭代时保留原始插入顺序...避免使用全局变量。局部变量查找比全局变量更快,将全局变量代码定义在函数运行通常会快 15%-30%。 避免使用.访问属性。

1.1K20

Python 使用和高性能技巧总结

,(浅)复制元素是原列表中元素别名,而深层复制是递归进行复制,对深层复制修改不影响原变量。...) # 如果找不到抛出ValueError异常 1.7 List 后向索引 这个只是习惯问题,前向索引时下标从0开始,如果反向索引也想从0开始可以使用~。...会保留 2.9 文件路径拼接 C/C++ 习惯通常直接用 + 将路径拼接,这很容易出错,Python os.path.join 会自动根据操作系统不同补充路径之间 / 或 \ 分隔符: import...会无参数调用type,给dict[key]提供一个初始值 3.5 有序 Dict import collections collections.OrderedDict(items=None) # 迭代时保留原始插入顺序...避免使用全局变量。局部变量查找比全局变量更快,将全局变量代码定义在函数运行通常会快 15%-30%。 避免使用.访问属性。

85110

Python 使用和高性能技巧总结

,(浅)复制元素是原列表中元素别名,而深层复制是递归进行复制,对深层复制修改不影响原变量。...) # 如果找不到抛出ValueError异常 1.7 List 后向索引 这个只是习惯问题,前向索引时下标从0开始,如果反向索引也想从0开始可以使用~。...会保留 2.9 文件路径拼接 C/C++ 习惯通常直接用 + 将路径拼接,这很容易出错,Python os.path.join 会自动根据操作系统不同补充路径之间 / 或 \ 分隔符: import...会无参数调用type,给dict[key]提供一个初始值 3.5 有序 Dict import collections collections.OrderedDict(items=None) # 迭代时保留原始插入顺序...避免使用全局变量。局部变量查找比全局变量更快,将全局变量代码定义在函数运行通常会快 15%-30%。 避免使用.访问属性。

70530

python 迭代器、生成器、yield、iter

返回 self,以便在应该使用可迭代对象地方使用迭代器,例如 在 for 循环中 不要在可迭代对象实现迭代器,一举两得?...生成器 只要 Python 函数定义体中有 yield 关键字,该函数就是生成器函数 调用生成器函数时,会返回一个生成器对象 惰性获取匹配 re.finditer ,可以节省内存和无效工作 生成器表达式可以理解为列表推导惰性版本...)) # A B C A, 产生元素副本,不断重复 print(list(itertools.islice(cy, 7))) # ['B', 'C', 'A', 'B', 'C', 'A', 'B']...("ALLLLAAGGG"): print(char, "->", list(group)) # A -> ['A'] # 没有相邻A # L -> ['L', 'L', 'L', 'L']...那个参数都会 成为生成器 函数定义体对应 yield 表达式

1.1K20

20个Python使用小技巧

,(浅)复制元素是原列表中元素别名,而深层复制是递归进行复制,对深层复制修改不影响原变量。...) # 如果找不到抛出ValueError异常 1.7 List 后向索引 这个只是习惯问题,前向索引时下标从0开始,如果反向索引也想从0开始可以使用~。...会无参数调用type,给dict[key]提供一个初始值 2.5 有序 Dict import collections collections.OrderedDict(items=None) # 迭代时保留原始插入顺序...避免使用全局变量。局部变量查找比全局变量更快,将全局变量代码定义在函数运行通常会快 15%-30%。 避免使用.访问属性。...使用 from module import name 会更快,将频繁访问成员变量 self.member 放入到一个局部变量。 尽量使用内置数据结构。

61920
领券