Here is a function that iterates over permutations of letters in a string:
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
In _permutations_rec in else part, I have two loops. In the first one I
pick the next item that I append to the current string. The second loop
iterates the next partial results and yields them. So, the second for is only to
handle the iterator for the recursive call and "bubble-up" its results.
I have found this pattern frequently when yielding results from recursive calls, e.g. when working with backtracking.
Question:
Is there an idiomatic, elegant way to use only one loop there, instead of two? Although I know there is nothing wrong there with those two loops, maybe there is some iterator kung-fu that would allow me to use only one (the simpler, the better).
Edit:
- I know
itertools.permutations, mypermutationsis just a toy example