从Python中的嵌套列表中删除连续的重复项?

Posted

技术标签:

【中文标题】从Python中的嵌套列表中删除连续的重复项?【英文标题】:Remove consecutive duplicates from nested list in Python? 【发布时间】:2020-05-08 23:33:49 【问题描述】:

我有一个嵌套列表,其结构如下:

mylist = [['A', 'Car', '15'], ['A', 'Car', '15'], ['A', 'Plane', '16'], ['A', 'Bike', '20'], ['A', 'Car', '16'], ['A', 'Boat', '16']]

它超长,大约有 1000 万个元素。我有很多这样的清单。我想做的是:

如果mylist 中每个连续元素的第三项(字符串编号)重复,则删除包含此重复的元素。

例如:

['A', 'Car', '15']['A', 'Car', '15']mylist的连续元素,它们都包含'15',所以它们是连续重复的,应该删除一个。

同样,['A', 'Car', '16']['A', 'Boat', '16'] 是连续的,并且都包含'16',所以应该删除一个。

所以,我最终的结果是:

newlist = [['A', 'Car', '15'], ['A', 'Plane', '16'], ['A', 'Bike', '20'], ['A', 'Car', '16']]

我最初是这样写的:

for ele in mylist:
    eleindex = mylist.index(ele)
    previousele = mylist[eleindex-1]
    if float(ele[2]) != float(previousele[2]):
        newlist.append(ele)

不幸的是,我编写的代码对于这么长的列表来说太长了。因此,我开始在网上查找并了解到 itertools 库(使用 groupby)非常有用,并且在做这些事情时非常快。然后我找到了一些我尝试模仿的示例,但是,它们主要用于简单列表 - 不像我的情况那样复杂一点。在修补之后,我无法弄清楚如何将它用于我的嵌套列表。

那么,有谁知道如何快速做到这一点?另外,如果您有比itertools 更快的解决方案,那就更好了!

【问题讨论】:

【参考方案1】:

itertools.groupby的解决方案:

from itertools import groupby

mylist = [['A', 'Car', '15'], ['A', 'Car', '15'], ['A', 'Plane', '16'], ['A', 'Bike', '20'], ['A', 'Car', '16'], ['A', 'Boat', '16']]

out = [next(g) for _, g in groupby(mylist, lambda k: k[2])]

print(out)

打印:

[['A', 'Car', '15'], ['A', 'Plane', '16'], ['A', 'Bike', '20'], ['A', 'Car', '16']]

基准(包含 10_000_000 个项目列表):

from timeit import timeit
from random import randint
from itertools import groupby

mylist = []
for i in range(10_000_000):
    mylist.append(['X', 'X', str(randint(0, 20))])

def f1():
    out = [next(g) for _, g in groupby(mylist, lambda k: k[2])]
    return out

t1 = timeit(lambda: f1(), number=1)

print(t1)

这在我的机器上打印(AMD 2400G,Python 3.8):

2.408908904006239

【讨论】:

以上是关于从Python中的嵌套列表中删除连续的重复项?的主要内容,如果未能解决你的问题,请参考以下文章

从 2D 列表中删除连续重复项,python?

从 Python 列表中删除重复项

使用 Python 删除对象列表中的重复项

将连续重复项变为一个值(Python)

如何删除已经在list中的重复项

从列表中删除(并计算)重复项