Обяснение на разбирането на списъка

Опитвам се да науча повече за динамичното програмиране и рекурсията за 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 вътре След това итерирате нов списък.

N.B. Ако настоявате да използвате разбиране там, Обмислете оператора на генератора. Той ще работи по същия начин, но без потребление на памет.

така че резултатът за цикъл не трябва да бъде

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

но

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