给定一个X元素列表,我需要生成一个k长度的序列。
如果list=[1,2,3],k=2,则结果为:
('1', '1')
('1', '2')
('1', '3')
('2', '1')
('2', '2')
('2', '3')
('3', '1')
('3', '2')
('3', '3')
itertools。产品(list,repeat=k-length)将非常有效,但我不允许使用它。
我看过源代码,虽然它对小序列很有效,但对于长序列,使用了太多内存。
非常正常,因为我们正在创建len(list)**k长度组合。
我的问题是,是否可以创建一个不创建中间“结果”列表的iterable生成器?
我一直在摆弄这个函数,并在考虑递归解决方案,但找不到任何解决问题的方法。
参考代码:
def product(*args, **kwds):
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]
for prod in result:
yield tuple(prod)
另一种方法:
def possible_combinations(sequence):
for a in sequence:
for b in sequence:
yield(a,b)
for combo in possible_combinations('123'):
print(combo)
使用此代码,我将得到3**2=9个结果,其中3是“123”字符串的长度,2是k。
如果k等于2,这种方法也可以工作,但是如果k动态变化,我需要k“for循环”,而不仅仅是2“for循环”。
如果k=3:
def possible_combinations(sequence):
for a in sequence:
for b in sequence:
for c in sequence:
yield(a,b,c)
for combo in possible_combinations('123'):
print(combo)
现在我有3个**k=27个结果。
如果k为4,则需要添加另一个for循环,如下所示:
def possible_combinations(sequence):
for a in sequence:
for b in sequence:
for c in sequence:
for d in sequence:
yield(a,b,c,d)
for combo in possible_combinations('123'):
print(combo)
现在我有了3*4=81个结果