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

时间:2016-03-04 19:11:47

标签: python list recursion iteration

如果我在Python中给出了像[1,1,2,2,2,3,3,5,5,5]这样的列表,并希望仅删除选择连续数字分组的第一次重复,然后打破并重复/递归以从第二组分组中删除第一个重复...我该怎么办?这是一个例子:

要将其分解:一旦代码检测到alist [0]和alist [1]中的第一个重复次数ie1,1,它将删除alist [1]并通过跳过其余的重复来打印解决方案数字子组。然后,它递归地回忆起自己。 SKIPS alist [0]和alist [1]这次穿过列表,找到alist [2],alist [3]重复,删除alist [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]

3 个答案:

答案 0 :(得分:2)

使用itertools.groupby

>>> 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是包含所有组的列表列表:

>>> groups
[[1, 1], [2, 2, 2], [3, 3], [5, 5, 5]]

现在,我们可以遍历此列表,并从当前组g中切出第一项,并使用切片和itertools.chain.from_iterable将其与其余组合并。

答案 1 :(得分:0)

如果不使用递归配方,您可以使用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] 连接其余项:

>>> def del_group(iterator):
...     groups = [list(g) for _,g in groupby(iterator)]
...     for i in range(len(groups)):
...         yield [item[1:] if ind == i else item for ind, item in enumerate(groups)]
... 
>>> list(del_group(alist))
[[[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]]]

但如果您想要在每次删除时获得所有结果,您可以使用以下功能:

allSquads

答案 2 :(得分:0)

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

close()