0

我已经进行了一些搜索,但实际上我不确定如何表达我想要发生的事情,所以我开始了一个问题。我确定它以前被覆盖过,所以我很抱歉。

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

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

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

例如,如果我有一个清单

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

我想从 2 开始并单独更改列表中的每个第二项 * (2 - 1 ) / 2。所以之后看起来像

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

我该如何以python方式做到这一点?

非常感谢!

编辑添加:

抱歉,我看到我的措辞不佳导致了一些混乱(我在上面更改了它)。

我不想更改每个 2 的倍数,我想更改列表中的每个第二项,即使它不是 2 的倍数。所以我不能使用 x % 2 == 0。对不起!

4

5 回答 5

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 或不想使用,循环可能是最清晰的:

>>> a = range(10)
>>> for j in range(i*2, len(a), i):
        # Not *= since we want ints
...     a[j] = a[j] * (i - 1) / i
于 2013-07-28T02:34:18.433 回答
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 / 2which 等价于itself / 2

于 2013-07-28T01:49:38.557 回答
2

您可以使用 Python 的扩展切片和切片分配来做到这一点:

>>> 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]
于 2013-07-28T03:56:58.423 回答
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:]]
于 2013-07-28T01:49:05.190 回答
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)]
于 2013-07-28T01:51:20.040 回答