2011-03-15 68 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) 
相關問題