Суммирование элементов списков в списке с использованием функций zip (), map () и itertools - PullRequest
1 голос
/ 16 апреля 2019

Я пишу программу, которая просматривает каждую возможную сумму броска костей, если X умереть с X сторонами. Например, для двух кубиков с шестью сторонами мне нужен список элементов, дающих все возможные уникальные суммы, которые можно получить с помощью этих кубиков (что-то вроде 2,3,3,4,4,4,4 и т. Д.). Я могу сделать это для небольших наборов (2 кубика и 6 сторон - это нормально), но для больших наборов, таких как 10 кубиков и 10 сторон, я сталкиваюсь с проблемами мема. Я думаю, что нашел решение, но у меня проблемы с реализацией.

У меня есть список списков, содержащий все броски каждого отдельного кубика. Для этого примера у нас есть 3 кубика, которые могут бросить 1, 2 или 3.

dice = [[1,2,3], [1,2,3], [1,2,3]]

outcomes = list(map(sum, zip(itertools.product(*dice))))

Я думаю, что части есть, но я продолжаю получать TypeError: неподдерживаемые типы операндов для +: 'int' и 'tuple'. Я пытался перемещать кусочки множеством способов, но ничего не щелкнуло. Что я делаю неправильно? В конечном счете мне дают число, скажем 6, которое я должен выяснить, какова вероятность того, что я брошу это число. Итак, моя цель с помощью приведенного выше кода - получить генератор, который я получу за общее число появившихся X-х чисел, и выяснить вероятность появления X-чисел. Я получил список для меньших входных данных, но, как я уже сказал, как только я получу большие входные данные, список становится слишком большим

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Для любого данного набора костей, вы знаете, что минимально возможная сумма броска костей будет min_value * num_dice.Например, если у вас есть 2 кубика с 6 сторонами, минимальное значение суммы кубиков будет 1 * 2 = 2.Точно так же вы знаете, что максимальное значение будет max_value * num_dice.Например, если у вас есть 2 кубика с 6 сторонами, максимальное значение суммы кубика будет 6 * 2 = 12.

Более того, если мы можем предположить, что все кости имеют одинаковые значения, и у каждой из сторон есть уникальныечисло и числа находятся в диапазоне [1, number_of_sides], тогда будет учитываться каждое целое число от min_value до max_value.

Следовательно, в python вы можете просто перечислить все уникальные суммыn кости с x сторонами следующим образом:

def all_possible_sums(number_of_dice: int, number_of_sides: int) -> List[int]:
    return list(range(number_of_dice, number_of_sides * number_of_dice + 1))
0 голосов
/ 16 апреля 2019

Вам не нужно zip здесь.Сопоставьте последовательность кортежей, сгенерированных непосредственно itertools.product с sum, и это будет последовательность искомых сумм:

outcomes = list(map(sum, itertools.product(*dice)))
...