如果重复元素在lis的子列表中出现两次,则删除该元素

2024-05-14 18:41:11 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,如果我在Python中得到了一个类似[1,1,2,2,2,3,3,5,5,5]的列表,并且希望只删除select continuous number分组的第一个重复,然后中断并重复/递归以从第二个分组etcc中删除第一个重复……我该怎么做?示例如下:

分解方法:一旦代码检测到第一个重复的数字对,即列表[0]和列表[1]中的1,1,它就会删除列表[1],并通过跳过剩余的数字子组重复来打印解决方案。然后,它递归地回忆自己。这次跳过列表[0]和列表[1],找到列表[2],列表[3]有重复,删除列表[3],中断并重复。。。。最终产生四种不同的输出

alist = [1,1,2,2,2,3,3,5,5,5]
# insert code here"
>>output = 
[1,2,2,2,3,3,5,5,5]
[1,1,2,2,3,3,5,5,5]
[1,1,2,2,2,3,5,5,5]
[1,1,2,2,2,3,3,5,5]

Tags: 方法代码示例number列表herecode数字
3条回答

不使用递归配方,您可以使用itertools.groupby()将重复项分组,然后使用第一项并通过itertools.chain.from_iterable()连接其余项:

>>> def del_group(iterator):
...     for _,g in groupby(iterator):
...         next(g)
...         yield g
... 
>>> 
>>> list(chain.from_iterable(del_group(alist)))
[1, 2, 2, 3, 5, 5]

但是,如果您想在每次删除时获得所有结果,可以使用以下函数:

^{pr2}$

使用^{}

>>> from itertools import chain, groupby
>>> alist = [1, 1, 2, 2, 2, 3, 3, 5, 5, 5]
>>> groups = [list(g) for _, g in groupby(alist)]
>>> for i, g in enumerate(groups):
        print list(chain.from_iterable(groups[:i] + [g[1:]] + groups[i+1:]))
...
[1, 2, 2, 2, 3, 3, 5, 5, 5]
[1, 1, 2, 2, 3, 3, 5, 5, 5]
[1, 1, 2, 2, 2, 3, 5, 5, 5]
[1, 1, 2, 2, 2, 3, 3, 5, 5]

这里groups是包含所有组的列表列表:

^{pr2}$

现在我们可以迭代这个列表,并从当前组g中切出第一个项目,并使用切片和itertools.chain.from_iterable将其与其余的组连接起来。在

对于列表中的每个唯一元素,删除列表中的第一个实例。 每次迭代使用原始列表的新副本。在

import copy

alist = [1,1,2,2,2,3,3,5,5,5]

for item in set(alist):
    temp = copy.copy(alist)
    temp.remove(item)
    print temp

相关问题 更多 >

    热门问题