from itertools import permutations
length = 5
p = permutations(range(1, length+1), length)
for i in p:
print(i)
UPD: This is for all list, not for identical items only.
You may find non-unique elements like this:
import collections
list = ['A', 'B', 'A', 'A', 'C']
non_unique = [item for item, count in collections.Counter(list).items() if count > 1]
print(non_unique)
And then combine this two pieces if code, let me think...
It is almost done solution
import collections
from itertools import permutations
my_list = ['A', 'B', 'A', 'A', 'C']
non_unique = [item for item, count in collections.Counter(my_list).items() if count > 1]
print(non_unique)
non_unique_enum = []
for filter_value in non_unique:
non_unique_enum.append([(index, value) for index, value in enumerate(my_list) if value == filter_value])
for row in non_unique_enum:
p = permutations([item[0] for item in row], len(row))
print(row)
for item in p:
print(item)
The output:
['A']
[(0, 'A'), (2, 'A'), (3, 'A')]
(0, 2, 3)
(0, 3, 2)
(2, 0, 3)
(2, 3, 0)
(3, 0, 2)
(3, 2, 0)
All you have to do is to mix this indices with static elements indices. It is also works if you have several non-unique letters, for example
my_list = ['A', 'B', 'A', 'A', 'C', 'B']