我做了一些搜索,但实际上我并不确定如何说出我想要发生的事情,所以我开始提问。我确定它之前已被覆盖,所以我道歉。
下面的代码不起作用,但希望它说明了我正在尝试做的事情。
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.抱歉!
答案 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)]