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

问题描述 投票:0回答:1

我有一个具有以下结构的嵌套列表:

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

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

如果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更快的解决方案,那就更好了!

python-3.x list performance group-by itertools
1个回答
2
投票

具有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
© www.soinside.com 2019 - 2024. All rights reserved.