У меня есть несколько повторяющихся элементов и разделенных пробелов:
# Elements
people = [0, 0, 1]
# Index
seats = ['a', 'a', 'b', 'b', 'c', 'd']
Количество элементов не может превышать номера индекса.Если количество элементов меньше номера индекса, индекс каждого типа можно оставить один индекс пустым.
from collections import Counter
def _is_elem_valid(people, seats) -> bool:
"""Valid elements check."""
counter = 0
for seat, c in Counter(seats).items():
if c > 1:
counter += 1
# "True" is valid.
# In this case is 6 >= 3 >= 2.
return len(seats) >= len(people) >= counter
Индекс такого же типа неупорядоченный и непрерывно .В остальном правила такие же, как у обычной перестановки.
Таким образом, результаты будут выглядеть следующим образом:
# None represent blank seats.
# Sorry about PEP8.
# Actual elements: (filled to the length of index)
[0, 0, 1, None, None, None]
# Index:
['a', 'a', 'b', 'b', 'c', 'd']
# Correspond to normal index:
[[0], [0], [1], [1], [2], [3]]
# For all 'a'
[ 0, 0, 1, None,None,None]
[ 0, 1, 0, None,None,None]
# For all 'b'
[ 0, None, 0, 1, None,None]
[ 1, None, 0, 0, None,None]
# For 'c'
[ 0, None, 1, None, 0, None]
[ 1, None, 0, None, 0, None]
[ 0, None, 0, None, 1, None]
# For 'd'
[ 0, None, 1, None,None, 0 ]
[ 1, None, 0, None,None, 0 ]
[ 0, None, 0, None,None, 1 ]
Я не очень знаком с алгоритмом перестановки.Есть ли здесь эффективное решение?