Объяснение понимания списка

Я пытаюсь узнать о динамическом программировании и рекурсии для Python 3.x. Код ниже представляет собой простой пример из моего учебника:

def recMC(coinValueList, change):
    minCoins = change
    if change in coinValueList:
        return 1
    else:
        for i in [c for c in coinValueList if c <= change]:
            numCoins = 1 + recMC(coinValueList, change-i)
            if numCoins < minCoins:
                minCoins = numCoins
        return minCoins

print(recMC([1,5,10,25], 63))

Я действительно изо всех сил пытаюсь понять строку 6 здесь, понимание строки. Я совершенно не уверен, что здесь происходит, и как разбить это на циклы, чтобы понять немного легче. Это моя мысль в ее нынешнем виде:

for i in c:
    for c in coinValueList:
        if c<= change:

Но я не понимаю, как это повторяется. Возможно, кто-то с лучшими знаниями мог бы объяснить это иначе, чем моя книга и профессор?


person idalsin    schedule 24.10.2013    source источник


Ответы (2)


for i in [c for c in coinValueList if c <= change]:

такой же как:

coins = []
for c in coinValueList:
    if c <= change:
        coins.append(c)

for i in coins:
    #do your stuff

понимание списка намного легче кодировать и лучше читать.
понимание списка - это "путь Python".

person Jan Meisel    schedule 24.10.2013
comment
list — плохой выбор для имени переменной, так как оно затеняет встроенный метод list(). - person Burhan Khalid; 24.10.2013
comment
@BurhanKhalid - да, ты прав! я заменил список на монеты - person Jan Meisel; 24.10.2013

позволь мне объяснить

[c for c in coinValueList if c <= change]

создайте новый список со значениями из coinValueList, которые меньше change внутри. После этого вы перебираете новый список.

Н.Б. Если вы настаиваете на использовании понимания, рассмотрите оператор генератора. Он будет работать так же, но без потребления памяти.

поэтому результат для цикла не должен быть

for i in c:
    for c in coinValueList:
        if c<= change:

но

for i in coinValueList:
    if i<= change:
person oleg    schedule 24.10.2013