【问题标题】:Deleting repeated element if it occurs twice in the sublist of a list [closed]如果重复元素在列表的子列表中出现两次,则删除它[关闭]
【发布时间】:2016-06-18 16:05:04
【问题描述】:

例如,如果在 Python 中给我一个类似 [1,1,2,2,2,3,3,5,5,5] 的列表,并且希望只删除选择连续数字分组的第一个重复,然后中断并重复/递归以从第二个分组等中删除第一个重复...我该怎么做?示例如下:

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

【问题讨论】:

  • 看看itertools.groupby
  • 不确定你的意思。请编辑以提供更多详细信息。

标签: python list recursion iteration


【解决方案1】:

使用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 将其与其余组连接。

【讨论】:

  • 谢谢!这太棒了!
  • 请注意,这可能会杀死列表中的唯一项目。但我想这对于 OP 的目的来说可能没问题,当然,如果这些项目总是至少有一次重复,那当然不是问题。
【解决方案2】:

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

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

【讨论】:

  • 您可能希望将集合转换回列表并对其进行排序。
  • 如果列表看起来像alist = [1,1,2,2,2,3,3,5,5,5,1,1,1] 怎么办?您应该使用索引而不是使用值来删除项目。
【解决方案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]

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

>>> 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]]]

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2020-11-02
    • 2020-08-02
    相关资源
    最近更新 更多