Понимание конкретного понимания списка Python - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь использовать этот код, который выдает все возможные результаты броска костей, учитывая количество костей и количество сторон.Этот код работает (но я не совсем понимаю, как работает понимание списка.

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

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Моим первым инстинктом для этой проблемы (и списком пониманий в целом) было бы использование рекурсии.Хотя вы просили петли, что удивительно сложно.

Это то, что я придумал;

def dice_rollsj(dice, sides):
    result = [[]]

    for num_dice in range(dice):
        temp_result = []
        for possible_new_values in range(1, sides+1):
            for existing_values in result:
                new_tuple = existing_values + [possible_new_values]
                temp_result.append(new_tuple)
        result = temp_result

Я думаю, что вы получите те же правильные ответы, но цифры будут по-разному упорядочены.Это может быть связано с тем, как значения добавляются в список.Я не знаю ... Дайте мне знать, если это поможет.

Я пытался добавить столько строк, сколько смог, потому что целью было расширить и понять понимание.

0 голосов
/ 27 января 2019

вы переопределяете результат с каждой итерацией цикла for y in pool.Я верю, что вы хотите добавить результаты:

result = []
for x in result:
   for y in pool:
      result.append(x + [y])
...