2

I have a list

a = ['A', 'B', 'A', 'A', 'C']

and I want to generate all possible permutations of item indices for identical items in a list

[0,1,2,3,4]
[2,1,0,3,4]
[3,1,2,0,4]
[0,1,3,2,4]
[2,1,3,0,4]
[3,1,0,2,4]

How to do this in a most pythonic way?

סטנלי גרונן
  • 2,917
  • 23
  • 46
  • 68
DrDom
  • 4,033
  • 1
  • 21
  • 23

1 Answers1

1
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']
Diman
  • 418
  • 3
  • 10