Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 是否从Python中的嵌套列表中删除连续重复项?_Python 3.x_List_Performance_Group By_Itertools - Fatal编程技术网

Python 3.x 是否从Python中的嵌套列表中删除连续重复项?

Python 3.x 是否从Python中的嵌套列表中删除连续重复项?,python-3.x,list,performance,group-by,itertools,Python 3.x,List,Performance,Group By,Itertools,我有一个嵌套列表,其结构如下: 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

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

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)
不幸的是,我写的代码对如此长的列表太长了。因此,我开始在网上查找,并了解到使用groupby的itertools库在做这类事情时非常有用,而且速度非常快。然后我找到了一些我尝试模仿的例子,但是,它们主要是针对简单的列表,而不是像我的情况那样稍微复杂一点的东西。在修改之后,我不知道如何将它用于嵌套列表

那么,有人知道如何快速完成这项任务吗?此外,如果您有一个比itertools更快的解决方案,那就更好了

使用itertools.groupby的解决方案:

印刷品:

[['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
使用itertools.groupby的解决方案:

印刷品:

[['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