所以我正在编写一个函数,将list
中奇数索引处的每个数字乘以2
。我被困了,因为我真的不知道如何接近它。
这是我的代码。
def produkt(pnr):
for i in pnr:
if i % 2 != 0:
i = i * 2
return pnr
例如,如果我输入produkt([1,2,3])
,我会回复[1,2,3]
,但我希望它为[2,2,6]
。
答案 0 :(得分:3)
请注意,修改示例中的i
不会更改输入列表中的值(整数是 immutable )。而且您还将值与位置混合在一起。
此外,由于索引从python中的0
开始,你得到了错误的方法。
在这些情况下,使用三元表达式的简单列表理解可以使用enumerate
来获取索引(使其从1
开始以匹配您的情况,您可以随意调整):
[p*2 if i%2 else p for i,p in enumerate(pnr,1)]
(注意if i%2
比if i%2 != 0
)
答案 1 :(得分:3)
使用列表推导:
将奇数乘以2:
[x*2 if x%2 else x for x in pnr]
澄清问题措辞后: 将奇数指数的数字乘以2:
[x*2 if i%2 else x for i,x in enumerate(pnr)]
答案 2 :(得分:1)
考虑使用列表推导:
def produkt(pnr):
return [k * 2 if k % 2 else k for k in pnr]
执行i = i * 2
您只需覆盖一个本地变量。
更新(问题已更改):
def produkt(pnr):
return [k * 2 if i % 2 else k for i, k in enumerate(pnr, 1)]
答案 3 :(得分:1)
您可以使用enumerate
获取索引,但是默认情况下会使用索引0
(而不是1
)启动索引,但它会接受一个启动参数来覆盖该默认值。
您的方法存在的问题是您没有更改实际的列表内容,只需为名称i
指定一个不同的值(代表列表元素,直到您分配与i = i*2
)不同的值。如果您希望它就地工作,您需要修改列表本身:例如pnr[idx] *= 2
或pnr[idx] = pnr[idx] * 2
。
但是,通常更容易创建新列表而不是修改现有列表。
例如:
def produkt(pnr):
newpnr = [] # create a new list
for idx, value in enumerate(pnr, 1):
# If you're testing for not-zero you can omit the "!=0" because every
# non-zero number is "truthy".
if idx % 2:
newpnr.append(value * 2) # append to the new list
else:
newpnr.append(value) # append to the new list
return newpnr # return the new list
>>> produkt([1,2,3])
[2, 2, 6]
甚至更好:使用生成器函数而不是使用所有这些append
s:
def produkt(pnr):
for idx, value in enumerate(pnr, 1):
if idx % 2:
yield value * 2
else:
yield value
>>> list(produkt([1,2,3])) # generators should be consumed, for example by "list"
[2, 2, 6]
当然你也可以使用列表理解:
def produkt(pnr):
return [value * 2 if idx % 2 else value for idx, value in enumerate(pnr, 1)]
>>> produkt([1,2,3])
[2, 2, 6]
答案 4 :(得分:0)
您的代码不起作用,因为i
不是对列表中的值的引用,而是它的值。
您必须再次将新值存储在列表中。
def produkt(pnr):
for i in range(len(pnr)):
if pnr[i] % != 0:
pnr[i] *= 2
return pnr
或使用这种更方便的解决方案:
def produkt(pnr):
return [x * 2 if x % 2==0 else x for x in pnr]
编辑:由于问题已经完全改变,您应该使用以下代码:
def produkt(pnr):
return [x * 2 if ind % 2 else x for ind, x in enumerate(pnr)]
第一个例子将每个奇数索引乘以2
,前一个代码将奇数索引处的数字乘以2
。
答案 5 :(得分:0)
试试这个:
def produkt(pnr):
return [ 2*x if i % 2 == 0 else x for i, x in enumerate(pnr)]
它将使用奇数索引对列表中的每个元素加倍。
>>> produkt([1,2,3])
[2, 2, 6]
答案 6 :(得分:-1)
您的问题是我是pnr列表中值的副本,而不是列表本身中的值。因此,在进行i = i * 2时,您不会更改列表。
现有答案已经很好,并展示了实现目标的惯用方法。但是,这是最小化的变化,使其按预期用于学习目的。
produkt(pnr):
new_pnr = list(pnr)
for ix in len(new_pnr):
if new_pnr[ix] % 2 != 0:
new_pnr[ix] *= 2
return new_pnr
如果没有new_pnr,您可以更改列表,然后您就不需要返回它了。