Python将列表分组为具有约束的子组

Jin*_*inx 3 python grouping

我真的搜索了这个,因为我几乎可以肯定之前已经问过一些变化,但我无法在谷歌中输入正确的术语来获得与我想要做的结果相匹配的结果。一般来说,人们似乎在寻找不受限制的总组合。

我正在尝试执行以下操作:

给定一个这样的列表:

[1, 1, 2, 2, 3, 3]将其分为[1, 2, 3]尽可能多的组

所以

[1, 1, 2, 2, 3, 3]->[[1, 2, 3], [1, 2, 3]]

[1, 1, 2, 3, 3]->[[1, 2, 3], [1, 3]]

[1, 1, 3, 3, 5]->[[1, 3, 5], [1, 3]]

[1, 4, 4, 7]->[[1, 4, 7], [4]]

笔记:

  1. 输入总是会被排序,但这些数字的值是未知的,所以它需要在一般意义上工作。

  2. 我的想法是,我有一些具有某些属性的对象,需要将它们组合在一起以创建不同的对象,但有时我会得到重复(并且可能是不完整的重复)——即,我曾经认为我的对象的属性总是只是但[1, 2, 3]事实证明有时我可以得到[1, 1, 2, 2, 3, 3],我需要一种方法将其分成两个[1, 2, 3]列表以在下游创建一个中间对象。

Cor*_*ien 5

您可以使用zip_longestgroupby来自itertools

from itertools import zip_longest, groupby

def f(l):
    z = zip_longest(*[list(g) for _, g in groupby(l)])
    return [[j for j in i if j is not None] for i in z]
Run Code Online (Sandbox Code Playgroud)

用法:

>>> f([1, 1, 2, 2, 3, 3])
[[1, 2, 3], [1, 2, 3]]

>>> f([1, 1, 2, 3, 3])
[[1, 2, 3], [1, 3]]

>>> f([1, 1, 3, 3, 5])
[[1, 3, 5], [1, 3]]

>>> f([1, 4, 4, 7])
[[1, 4, 7], [4]]

# Update
>>> f(sorted([1, 1, 2, 2, 3, 3, 1, 2]))
[[1, 2, 3], [1, 2, 3], [1, 2]]

# Update 2
>>> f([1, 1, 1, 2, 2, 2, 3, 3])
[[1, 2, 3], [1, 2, 3], [1, 2]]
Run Code Online (Sandbox Code Playgroud)

更新

@cards 建议的替代版本使用filterfalse

from itertools import zip_longest, groupby, filterfalse

def f(l):
    z = zip_longest(*[list(g) for _, g in groupby(l)])
    return [list(filterfalse(lambda j: j is None, i)) for i in z]
Run Code Online (Sandbox Code Playgroud)