Я пытаюсь использовать этот код, который выдает все возможные результаты броска костей, учитывая количество костей и количество сторон.Этот код работает (но я не совсем понимаю, как работает понимание списка.
def dice_rolls(dice, sides):
"""
Equivalent to list(itertools.product(range(1,7), repeat=n)) except
for returning a list of lists instead of a list of tuples.
"""
result = [[]]
print([range(1, sides + 1)] * dice)
for pool in [range(1, sides + 1)] * dice:
result = [x + [y] for x in result for y in pool]
return result
Поэтому я пытаюсь переписать понимание списка
result = [x + [y] for x in result for y in pool]
в циклы FORчтобы попытаться понять, как это работает, но в настоящее время я не могу правильно это сделать. Текущий сбойный код:
for x in result:
for y in pool:
result = [x + [y]]
2-й вопрос: если бы я хотел превратить это в генератор (потому что эта функцияпамяти, если у вас достаточно кубиков и сторон), я бы просто выдавал каждый элемент в списке по мере его производства вместо того, чтобы бросать его в список результатов?
РЕДАКТИРОВАТЬ: я придумал способразбить понимание списка на циклы после получения отличных ответов и хотел захватить его:
def dice_rolls(dice, sides):
result = [[]]
for pool in [range(1, sides + 1)] * dice:
temp_result = []
for existing_values in result: # existing_value same as x in list comp.
for new_values in pool: # new_value same as y in list comp.
temp_result.append(existing_values + [new_values])
result = temp_result
return result