Question about permutations (itertools)

V

Vincent Davis

As a note I am doing this in py3.

I am looking for the most efficient (speed) way to produce an an
iterator to of permutations.
One of the problem I am having it that neither combinations nor
permutations does not exactly what I want directly.
For example If I want all possible ordered lists of 0,1 of length 3
(0,0,0)
(0,0,1)
(0,1,1)
(1,1,1)
(1,0,1)
(1,1,0)
(1,0,0)
I don't see a way to get this directly from the itertools. But maybe I
am missing something. I see ways to get a bigger list and then remove
duplicates.
list(permutations([0,1], 3))
[]
('0', '0', '0')
('0', '0', '1')
('0', '1', '1')
('1', '1', '1')

Is it possible to get combinations_with_replacement to return numbers
rather than strings? (see above)

Thanks
Vincent
 
P

Peter Otten

Vincent said:
As a note I am doing this in py3.

I am looking for the most efficient (speed) way to produce an an
iterator to of permutations.
One of the problem I am having it that neither combinations nor
permutations does not exactly what I want directly.
For example If I want all possible ordered lists of 0,1 of length 3
(0,0,0)
(0,0,1)
(0,1,1)
(1,1,1)
(1,0,1)
(1,1,0)
(1,0,0)
I don't see a way to get this directly from the itertools. But maybe I
am missing something.
for t in itertools.product([0, 1], repeat=3):
.... print(t)
....
(0, 0, 0)
(0, 0, 1)
(0, 1, 0) # Seems you missed one
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)
I see ways to get a bigger list and then remove
duplicates.
list(permutations([0,1], 3))
[]
list(combinations_with_replacement('01',3))
('0', '0', '0')
('0', '0', '1')
('0', '1', '1')
('1', '1', '1')

Is it possible to get combinations_with_replacement to return numbers
rather than strings? (see above)
for t in itertools.combinations_with_replacement([0, 1], 3):
.... print(t)
....
(0, 0, 0)
(0, 0, 1)
(0, 1, 1)
(1, 1, 1)

Peter
 
M

Mark Dickinson

For example If I want all possible ordered lists of 0,1 of length 3
(0,0,0)
(0,0,1)
(0,1,1)
(1,1,1)
(1,0,1)
(1,1,0)
(1,0,0)
I don't see a way to get this directly from the itertools. But maybe I
am missing something.

In this case, you're missing itertools.product:
list(itertools.product([0, 1], repeat=3))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1,
1, 0), (1, 1, 1)]
 
U

Ulrich Eckhardt

Vincent said:
I am looking for the most efficient (speed) way to produce an an
iterator to of permutations.
One of the problem I am having it that neither combinations nor
permutations does not exactly what I want directly.
For example If I want all possible ordered lists of 0,1 of length 3
(0,0,0)
(0,0,1)
(0,1,1)
(1,1,1)
(1,0,1)
(1,1,0)
(1,0,0)
I don't see a way to get this directly from the itertools. But maybe I
am missing something. I see ways to get a bigger list and then remove
duplicates.

You have three digits where each digit can have two values (binary digits,
a.k.a. bits), so the number of combinations is 2*2*2 = 8. Even if the
possible values where unevenly distributed, you could calculate the number
of combinations by multiplying. Then, there are two different approaches:
1. count with an integer and then dissect into digits
# Note: Using // for integer division in Python3!
digit0 = n % base0
digit1 = (n // base0) % base1
digit2 = (n // base0 // base1) % base2

2. simulate digits and detect overflow
Here you simply count up the "ones" and if they overflow, you reset them to
zero and count up the "tens".


What I don't really understand is what you mean with "ordered lists".

Uli
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,065
Latest member
OrderGreenAcreCBD

Latest Threads

Top