Расширение понимания списка, ведущее к бесконечному циклу в списках наборов мощности

Я пытался решить проблему со списком наборов мощности в вопросе 78 на Leetcode. Я столкнулся с решением, в котором используется понимание списков и оно работает. Я попытался расширить его и использовать документацию по Python, чтобы убедитесь, что я получаю правильный синтаксис, но я, кажется, попадаю в бесконечный цикл.

Учитывая набор различных целых чисел, nums, вернуть все возможные подмножества (множество мощности).

Примечание. Набор решений не должен содержать повторяющихся подмножеств.

Пример:

Input: nums = [1,2,3]
Output:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

Код в решении:

    def subsets(nums):
        nums.sort()
        result = [[]]
        for num in nums:
            result += [i + [num] for i in result]
        return result 

Код с моим изменением:

  def subsets(nums):
    """
    :type nums: List[int]
    :rtype: List[List[int]]
    """
    result = [[]]

    for num in nums:
      for list_ in result:
        result.append([num] + list_)
    return result

Я думаю, что с каждой итерацией цикла for list_ in result: результат становится больше, и поэтому я бы не дошел до конца, но почему это не тот же случай с пониманием списка? Что мне не хватает?


person heretoinfinity    schedule 24.06.2018    source источник
comment
Да, вы никогда не должны добавлять к списку, который вы повторяете. Однако вы можете создать его неглубокую копию (results_iter = list(results)) и перебирать ее, пока вы добавляете к исходному списку result.   -  person Roberto    schedule 24.06.2018
comment
@Roberto, спасибо, что указали простой способ создания неглубокой копии списка. Я не знал, что использование list() можно использовать в списке для создания списка. Другие предложения касались импорта модулей.   -  person heretoinfinity    schedule 24.06.2018
comment
Пожалуйста, не делайте этого: class Solution(object): Если это требование какой-то системы оценивания, то сократите свой вопрос до минимально воспроизводимого примера .   -  person juanpa.arrivillaga    schedule 24.06.2018
comment
@juanpa.arrivillaga, я удалил то, что вы просили раздеть.   -  person heretoinfinity    schedule 24.06.2018


Ответы (1)


Поскольку сначала разрешается [i + [num] for i in result], а затем, как только это вычисляется, происходит часть result +=, которая отличается от вашей, где вы добавляете 1 на 1. Другое решение добавляет все сразу, поэтому проблем нет.

person juvian    schedule 24.06.2018