Python - 我不知道如何在这段代码中使用min

时间:2014-07-25 23:08:53

标签: python python-2.7 min

我的老师给了我这段代码:

def n_o_c(Q,v):  
    M=[None]*(Q+1)  
    m={}  
    M[0]=0  
    for q in xrange(1,Q+1):  
        M[q]=min(M[q-a]+1 for a in v if q-a>=0)    
    return M[Q],m  

print n_o_c(18,[1,2,5])  

第一个我解释剧本,它是一个假定的硬币机器,我必须知道我需要多少硬币支付Q数量有v币(我们必须做更少的硬币作为18 * 3硬币1x2硬币的可用IE和1x1硬币)

我不明白M [q]行是什么,我试图打印M,我得到的结果是从1到18的每个数字需要多少钱才能完成这个数字。 M = [0,1,1,2,2,3,2,2,3,3,2,3,3,4,4,3,4,4,5] Q = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]

有人可以解释一下min的工作原理吗?

我已经做过了(我知道这不是解决练习的好方法,但我不知道更好的方法)。解决:

def n_o_c(Q,v):  
    M=[None]*(Q+1)  
    m={}  
    M[0]=0  
    for q in xrange(1,Q+1):  
        M[q]=min(M[q-a]+1 for a in v if q-a>=0)
    monedas=0
    total=Q
    m=[] # did this to change dictionary to array
    while(monedas<M[Q]):
        for a in v[::-1]:
            if total-a >= 0:
                total = total-a
                monedas = monedas +1
                m.append(a)
                break #I forget this break
    return M[Q],m  

print n_o_c(18,[1,2,5])  

2 个答案:

答案 0 :(得分:2)

min功能很简单:

  

返回可迭代中的最小项

棘手的一点是,那个可迭代的东西是什么?

M[q]=min(M[q-a]+1 for a in v if q-a>=0)    

(M[q-a]+1 for a in v if q-a>=0)被称为生成器表达式;更一般地说,它是一种理解。

从官方教程中的List Comprehensions开始,了解一般工作中的理解,然后Iterators以及以下两个部分(生成器和生成器表达式),以了解生成器表达式的不同之处。*

但我可以在这里总结一下,至少足以让你开始。

首先,列表理解:

[M[q-a]+1 for a in v if q-a>=0]

这意味着您要构建一个列表,就像您将它展开到这样的循环中一样:

value = []
for a in v:
    if q-a>=0:
        value.append(M[q-a]+1)
M[q] = min(value)

或者,更直观地说,请尝试大声朗读:如果M[q-a]+1作为英语句子有意义,则av的每个q-a>=0列表,并且意味着与Python完全相同的东西。 (如果你有数学背景,你可能想要用套装显示来考虑它,但我会假设你没有。)

生成器表达式执行相同的操作,除了不是构建列表,而是在迭代它时按需创建值。您可以将此视为一种神奇的列表,目前不会浪费内存或时间。要在Python中拼写它,只需将方括号[]转换为括号()(在这种情况下你可以放弃,因为min调用已经有括号)。要大声朗读,只需留下&#34;&#34;列表&#34;一部分。


*一旦你明白了,如果你想了解更多,请看看itertools模块,阅读David Beazley的Generator Tricks for System Programmers和Google的Greg Ewing&#39; s关于发电机的介绍。

答案 1 :(得分:0)

为什么我的老师代码中没有使用?

这是一个解决方案: 对v列表进行排序并按每个维度除以得到num硬币并继续更改剩余。

def n_o_c(Q,v):   
   m = {}

   for dimension in sorted(v, reverse= True):
       num_coins = int(Q/dimension)
       ## if Q is not divisible by the dimension, go to the next dimension
       if num_coins != 0:
       ## if Q is divisible, store num_coins in the dictionary
          m[dimension] = num_coins
       ## Get change remaining by modulo function and store it as remaining Q that needs to be broken down
       Q = Q % dimension
   return m

print n_o_c(18,[1,2,5])

应该打印: {1:1,2:1,5:3}