2011-03-15 67 views

回答

9

如果 “数组” 你的意思是 “清单”:

[0 if e == 1 else e for e in a] 

其中a是您的清单。

如果“数组”你的意思是array.array

array.array('i', [0 if e == 1 else e for e in a]) 
+3

l是pep8失败 – Tom

+0

我会在一般情况下添加单字母变量suck bigtime。 –

0

如果你的“阵列”是一个“清单”你可以做一个列表理解:

x = [1,2,3,6,7,8,1,1,1,6,7,5] 
x = [item if item != 1 else 0 for item in x] 

当然,这将创建一个新的名单。如果您的列表是非常大的,你不希望创建一个新的你可以这样做,而不是:

for i, item in enumerate(x): 
    if item == 1: 
     x[i] = 0 

或者这样:

for i in xrange(len(x)): 
    if x[i] == 1: 
     x[i] == 0 
+0

如果列表真的很大......那么你的方法会变得很慢... – Chong

+0

@Chong:第一个将是内存效率低下但速度更快,第二个将会更慢,但内存效率更高。但是,再次,如果它是一个Python列表,这些是实现它的方法(除了Sven的答案)。如果它是一个numpy数组,那么选项是不同的。 –

1

大型列表蒙山只有少数出现1 ,以下是比天真for循环改变的地方名单更高效:

i = a.index(1) 
try: 
    while True: 
     a[i] = 0 
     i = a.index(1, i + 1) 
except ValueError: 
    pass 

这也比天真的for循环的可读性,所以如果性能问题只用它。

4

我只是想提也可以使用numpy的阵列,在这种情况下,你可以做到以下几点:

import numpy 
a = numpy.array([1,2,3,6,7,8,1,1,1,6,7,5]) 
numpy.where(a==1,0,a) 
相关问题