鉴于列表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
答案 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']