I can get integer permutations like this:
myInt = 123456789
l = itertools.permutations(str(myInt))
[int(''.join(x)) for x in l]
Is there a more efficient way to get integer permutations in Python, skipping the overhead of creating a string, then joining the generated tuples? Timing it, the tuple-joining process makes this 3x longer than list(l)
.
added supporting information
myInt =123456789
def v1(i): #timeit gives 258ms
l = itertools.permutations(str(i))
return [int(''.join(x)) for x in l]
def v2(i): #timeit gives 48ms
l = itertools.permutations(str(i))
return list(l)
def v3(i): #timeit gives 106 ms
l = itertools.permutations(str(i))
return [''.join(x) for x in l]
I can't comment on Simeon's answer, so I'm adding this here.
If you try to permute
120
with the function in the answer, you get12 and 21 are wrong answers, so I made a modification to discard them:
Edit: also forgot to add that the function will count the same digits twice, leaving you with duplicates, so I modified that as well.
You can do:
This avoids conversion to and from a tuple as it'll use the integer's position in the tuple to compute its value (e.g.,
(1,2,3)
means100 + 20 + 3
).Because the value of
n_digits
is known and the same throughout the process, I think you can also optimize the computations to:I also think we don't need to call
zip()
all the time because we don't need that list:This will give you a generator:
Then you can iterate over each item:
Or convert it to a list, but it'll take some time:
EDIT: Clarified that you want back an integer, maybe the fastest way is using another lazy evaluation: