列表中具有“距离限制”的唯一组合

时间:2018-09-09 09:26:39

标签: python python-3.x combinations itertools

鉴于列表a = ['a', 'b', 'c', 'd', 'e'],按照经典的SO answer

,我将使用itertools.combinations来获得['ab', 'ac', ...]之类的所有唯一组合。

如何将唯一组合限制为不超过n个斑点的项目?

示例

如果我希望列出的项目不超过n=2个点,我会接受'ab''ac'作为组合,但不接受'ae',因为{{1 }}和'a'大于'e'

编辑-代码

下面是普通的python代码解决方案,由于double-for循环,我会避免使用它,这对于大列表而言并不理想

n=2

1 个答案:

答案 0 :(得分:1)

就复杂性而言,您的解决方案已接近最佳解决方案。 您可以将其重构为生成器,以便仅在需要它们时才生成值,这样就不必同时将所有值保存在内存中:

def combis(source, max_distance=2):
    for i, item in enumerate(source):
        for j in range(i+1, min(i+max_distance+1, len(source))):
            yield item+source[j]

然后可以遍历生成器:

>>> for combi in combis(['a', 'b', 'c', 'd', 'e']):
...     print(combi)
...
ab
ac
bc
bd
cd
ce
de

如果您需要将它们全部存储在列表中,则仍然可以使用生成器对其进行初始化:

>>> list(combis(['a', 'b', 'c', 'd', 'e']))
['ab', 'ac', 'bc', 'bd', 'cd', 'ce', 'de']