Список факториальных комбинаций в питоне - PullRequest
0 голосов
/ 24 октября 2019

Предположим, у меня есть список данных, подобных этому [['a', 'a', 'b'], ['a', 'a', 'b','b']]

Я хочу вывести список всех перестановок для a = 1 or 2, b = 3 or 4

Для случая ['a', 'a', 'b'], чтобы вывести:

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

Как мне это сделать? Спасибо за помощь

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Если вы структурируете свой ввод немного по-другому, ниже работает:

from itertools import product

values = {
    'a': [1, 2],
    'b': [3, 4]
}

case = ['a', 'a', 'b']

coms = product(*[values[c] for c in case])

for c in coms:

    print(list(c))

Отпечатки:

[1, 1, 3]
[1, 1, 4]
[1, 2, 3]
[1, 2, 4]
[2, 1, 3]
[2, 1, 4]
[2, 2, 3]
[2, 2, 4]
1 голос
/ 24 октября 2019

Вы можете найти все перестановки списка с помощью 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() не допускает повторяющихся значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...