将奇数指数乘以2?

时间:2017-09-04 11:59:37

标签: python list

所以我正在编写一个函数,将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]

7 个答案:

答案 0 :(得分:3)

请注意,修改示例中的i不会更改输入列表中的值(整数是 immutable )。而且您还将位置混合在一起。

此外,由于索引从python中的0开始,你得到了错误的方法。

在这些情况下,使用三元表达式的简单列表理解可以使用enumerate来获取索引(使其从1开始以匹配您的情况,您可以随意调整):

[p*2 if i%2 else p for i,p in enumerate(pnr,1)]

(注意if i%2if 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] *= 2pnr[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,您可以更改列表,然后您就不需要返回它了。