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])