Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-我不知道如何在这段代码中使用min_Python_Python 2.7_Min - Fatal编程技术网

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

Python-我不知道如何在这段代码中使用min,python,python-2.7,min,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

我的老师给了我这个密码:

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 3x5硬币1x2硬币和1x1硬币)

我不明白M[q]线是什么意思,我试着打印M,结果是从1到18的每个数字,它需要多少硬币来做这个数字。 M=[0,1,1,2,2,3,2,2,3,3,2,3,3,4,4,3,4,5] q=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]

有人能给我解释一下min是怎么工作的吗

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

定义n_o_c(Q,v): M=[无]*(Q+1) m={} M[0]=0 对于X范围内的q(1,q+1): M[q]=min(如果q-a>=0,则v中a的M[q-a]+1) 莫尼达斯=0 总数=Q m=[]#这样做是为了将字典更改为数组 而(monedas=0: 总计=总计-a 莫尼达斯=莫尼达斯+1 m、 附加(a) 休息,我忘了休息 返回M[Q],M 打印n____c(18,[1,2,5]) 该功能是最简单的部分:

返回iterable中最小的项

棘手的是,这是怎么回事

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

从官方教程中的开始学习理解在一般情况下是如何工作的,然后和以下两个部分(生成器和生成器表达式)学习生成器表达式是如何不同的*

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

首先,列表理解:

[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)
或者,更直观地说,试着大声朗读:如果
q-a>=0
,则为
v
中的
a
列出每个
M[q-a]+1
,其含义与Python完全相同。(如果你有数学背景,你可能想用集合显示来代替,但我假设你没有。)

生成器表达式的作用与此相同,只是它不构建列表,而是在您对其进行迭代时根据需要创建值。您可以将其视为一种神奇的列表,暂时不会浪费内存或时间。要在Python中拼写它,只需将方括号
[]
转换为括号
()
(在本例中,您可以省去它,因为
min
调用中已经有括号了)。要大声朗读,只需留下“列表”部分



*一旦你明白了这一点,如果你想了解更多,请看一看David Beazley和google为Greg Ewing关于发电机的演示所读的模块。

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

以下是一个解决方案: 对v列表进行排序,并将其除以每个维度以获得num coins,然后继续进行剩余更改

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}

结果中的
(5[5,2,1,5,2,1])
是什么?解决了,我忘了在“for”中加上中断符所以它不起作用了?你为什么说你已经做了?现在它起作用了我知道,但是你在你的问题中说它已经解决了,所以有点困惑。谢谢,我有很多东西要学习和阅读。我更了解它,但我会读到你也有我的链接。拥抱
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])