这是一个迭代字符串中字母排列的函数:
def permutations(items):
for x in _permutations_rec('', items, len(items)):
yield x
def _permutations_rec(current, items, n):
if len(current) == n:
yield current
else:
for item, other_items in pick_item(items):
for next_ in _permutations_rec(current+item, other_items, n):
yield next_
def pick_item(items):
for i, item in enumerate(items):
yield item, items[:i] + items[i+1:]
# print permutations
for x in permutations('abc'):
print x
在某种程度上_permutations_rec
,else
我有两个循环。在第一个中,我选择附加到current
字符串的下一个项目。第二个循环迭代下一个部分结果并产生它们。因此,第二个for
只是处理递归调用的迭代器并“冒泡”它的结果。在递归调用产生结果时,我经常发现这种模式,例如在使用backtracking时。
问题:
有没有一种惯用的、优雅的方式来只使用一个循环,而不是两个?虽然我知道这两个循环没有任何问题,但也许有一些迭代器功夫可以让我只使用一个(越简单越好)。
编辑:
- 我知道
itertools.permutations
,我permutations
的只是一个玩具例子