在循环中更改列表中的值?

时间:2013-07-28 01:44:21

标签: python loops

我做了一些搜索,但实际上我并不确定如何说出我想要发生的事情,所以我开始提问。我确定它之前已被覆盖,所以我道歉。

下面的代码不起作用,但希望它说明了我正在尝试做的事情。

sieve[i*2::i] *= ((i-1) / i):

我想获取一个列表并浏览列表中与“i”的倍数相关的每个项目,并通过乘以相同的数量来更改其值。

例如,如果我有一个列表

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我希望从2开始并更改列表中的每个第2项,单独*(2 - 1)/ 2.所以在看起来像

之后
[1, 2, 3, 2, 5, 3, 7, 4, 9, 5]

我该如何蟒蛇化?

非常感谢你!

编辑添加:

抱歉,我看到我可怜的措辞引起了一些混乱(我已经在上面改了)。

我不想改变2的每个倍数,我想改变列表中的每一个项目,即使它不是2的倍数。所以我不能使用x%2 == 0.抱歉!

5 个答案:

答案 0 :(得分:3)

NumPy实际上会让你这样做!

>>> import numpy as np
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> i = 2
>>> a[i*2::2] *= (i-1.0)/i
>>> a
array([0, 1, 2, 3, 2, 5, 3, 7, 4, 9])

如果你不能使用NumPy或者不喜欢使用NumPy,那么循环可能是最清晰的:

>>> a = range(10)
>>> for j in range(i*2, len(a), i):
        # Not *= since we want ints
...     a[j] = a[j] * (i - 1) / i

答案 1 :(得分:2)

你可以这样做:

>>> def sieve(L, i):
...     temp = L[:i]
...     for x, y in zip(L[i::2], L[i+1::2]):
...             temp.append(x)
...             temp.append(y/2)
...     return temp
... 
>>> sieve([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2)
[1, 2, 3, 2, 5, 3, 7, 4, 9, 5]

请注意,itself * (2 - 1 ) / 2相当于itself * 1 / 2,相当于itself / 2

答案 2 :(得分:2)

您可以使用Python的extended slicing和切片分配来执行此操作:

>>> li=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> li[3::2]=[x/2 for x in li[3::2]]
>>> li
[1, 2, 3, 2, 5, 3, 7, 4, 9, 5]

答案 3 :(得分:1)

map(lambda x : x * (2 - 1) / 2 if x % 2 == 0 else x, list)

这应该做你想要的。

修改

或者在样式中,您可以使用列表推导,如下所示:

i = 2
list[:i] + [x * (i - 1) / i if x % i == 0 else x for x in list[i:]]

答案 4 :(得分:1)

根据您的编辑,您可以使用范围执行此操作。

for i in range(1, len(listnums), 2):
    listnums[i] /= 2

如果您想使用列表推导执行此操作,则可以使用enumerate与其他版本类似地执行此操作。

def sieve(listnums, divisor):
    return [num if i % divisor else num/divisor for i, num in enumerate(listnums, 1)]