Вернуть возможные перестановки для данного массива - PullRequest
0 голосов
/ 29 апреля 2018

Для данного списка со строковыми цифрами я хочу вернуть разные строковые номера, которые могут быть сгенерированы с использованием всех элементов в списке (поэтому, если имеется 5 элементов, число должно состоять из 5 цифр).

Задача - вернуть возможные перестановки, наименьшую перестановку и максимальную перестановку в списке.

  • ответ должен быть преобразован в целые числа
  • Если на входе присутствует «0», он будет производить числа строк с начальными нулями, это не учитывается при их преобразовании в целые числа.

Теперь это мой код:

from itertools import permutations

def proc_arr(arr):


    lst = [] # define new list
    list_of_tuples = list(permutations(arr, len(arr))) # now they are tuples in a list

    # convert to integers in list
    separator = [map(str,x) for x in list_of_tuples]
    together = [int(''.join(s)) for s in separator]

    # append to new list and return the len of possible combinations, min and max value
    lst.append(len(together))
    lst.append(min(together))
    lst.append(max(together))

    #print(lst)
    return lst


proc_arr(['1','2','2','3','2','3'])

Однако я не понимаю, почему я не получаю нужное количество перестановок.

вход: proc_arr (['1', '2', '2', '3', '2', '3']) выход: [60, 122233, 332221]

и я получаю [720, 122233, 332221]

другой пример ввода и вывода

input: proc_arr (['1', '2', '3', '0', '5', '1', '1', '3']) выход: [3360, 1112335, 53321110]

1 Ответ

0 голосов
/ 29 апреля 2018

Вы, кажется, считаете одну и ту же перестановку несколько раз, потому что вы рассматриваете цифры, которые появляются несколько раз, как разные. То есть, например, 122233 и 122233 подсчитываются каждый, потому что один имеет «первое» 3 первое, а второе - нет.

Одним из решений было бы подсчитать, сколько дубликатов у вас будет, и исключить их из подсчета. В вашем примере есть 3 2 с, поэтому есть 1 * 2 * 3 = 6 способов их размещения, оставляя все остальное таким же; Таким образом, ваш ответ в 6 раз слишком велик из-за 2-х. Аналогично для 2 3 s: 1 * 2 = 2 способа, поэтому разделите ваш ответ на 2. Таким образом, вы получите правильный ответ 720/6/2 = 60.

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