Вы можете найти все перестановки списка с помощью itertools.permutations
:
>> import itertools
>> list(itertools.permutations(['a', 'a', 'b'])
[('a', 'a', 'b'), ('a', 'b', 'a'), ('a', 'a', 'b'), ('a', 'b', 'a'), ('b', 'a', 'a'), ('b', 'a', 'a')]
В вашем случае вы хотите протестировать все комбинации значений от a
до b
так что для вашего первого случая:
import itertools
for a in range(1, 3): # a is 1 or 2
for b in range(3, 5): # b is 3 or 4
# Construct your list for this combination of values of a and b
l = [a, a, b]
# Find all permutations and print them
print(list(itertools.permutations(l))
Ваш второй случай будет таким же, но вам необходимо соответствующим образом изменить переменную l
.
Вы можете сделать это для спискасписков, как в исходном запросе, путем автоматического создания списка из ранее указанного списка:
all_lists = [['a', 'a', 'b'], ['a', 'a', 'b', 'b']]
for this_list in all_lists:
for a in range(1, 3): # a is 1 or 2
for b in range(3, 5): # b is 3 or 4
# Construct your list for this combination of values of a and b
l = [a if x == 'a' else b if x == 'b' else x for x in this_list]
print('Permutations for ' + str(l))
print(list(itertools.permutations(l)))
print('-----------')
Если вы запустите приведенный выше код, вы поймете, что существует множество повторяющихся перестановок, потому что естьповторяющиеся значения в списке ([1, 1, 3, 3]
переставляет для себя три раза: переключение только первого 1 со вторым 1, переключение только первых 3 со вторым 3 и переключение 1 и 3). Если вы хотите избавиться от повторяющихся значений в своем результате, вы можете использовать set(itertools.permutations(l))
вместо list(itertools.permutations(l))
, поскольку set()
не допускает повторяющихся значений.