如果我在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]
答案 0 :(得分:2)
>>> 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()