2010-04-06 102 views
140

我必須搜索列表並用一個元素替換所有出現的元素。到目前爲止,我對代碼的嘗試讓我無處可去,那麼執行此操作的最佳方法是什麼?查找和替換列表中的元素(python)

例如,假設我的列表中有下列整數

>>> a = [1,2,3,4,5,1,2,3,4,5,1] 

,我需要用值來代替數字1出現的所有10所以我需要輸出

>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10] 

因此我的目標是將數字1的所有實例替換爲數字10.

+6

這是什麼,順便說一下? – outis 2010-04-06 01:40:29

回答

144
>>> a= [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1] 
>>> for n, i in enumerate(a): 
... if i == 1: 
...  a[n] = 10 
... 
>>> a 
[10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10] 
+2

這是一個糟糕的非pythonic解決方案。考慮使用列表理解。 – AdHominem 2016-12-31 11:56:23

+49

這是一個很好的如果非pythonic解決方案。考慮使用列表理解。 – 2017-02-02 13:35:42

314

嘗試使用list comprehensionternary operator

>>> a=[1,2,3,1,3,2,1,1] 
>>> [4 if x==1 else x for x in a] 
[4, 2, 3, 4, 3, 2, 4, 4] 
+4

但是這不會改變'a',雖然對嗎?我認爲OP想要'a'改變 – Dula 2016-02-03 23:26:34

+4

@Dula你可以做a = [4如果x == 1 else x for x in a],這將影響 – 2016-04-11 07:57:40

+0

@Dula:關於「a」應該進行變異,但是(正如Alekhya所示)在使用列表理解時處理這兩種情況都是微不足道的。 – outis 2016-08-15 11:55:34

7
>>> a=[1,2,3,4,5,1,2,3,4,5,1] 
>>> item_to_replace = 1 
>>> replacement_value = 6 
>>> indices_to_replace = [i for i,x in enumerate(a) if x==item_to_replace] 
>>> indices_to_replace 
[0, 5, 10] 
>>> for i in indices_to_replace: 
...  a[i] = replacement_value 
... 
>>> a 
[6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6] 
>>> 
17

列表解析效果很好 - 與枚舉循環通過可以爲您節省一些內存(B/C的操作的基本到位做)。

還有函數式編程...查看map用法:

 
    >>> a = [1,2,3,2,3,4,3,5,6,6,5,4,5,4,3,4,3,2,1] 
    >>> map(lambda x:x if x!= 4 else 'sss',a) 
    [1, 2, 3, 2, 3, 'sss', 3, 5, 6, 6, 5, 'sss', 5, 'sss', 3, 'sss', 3, 2, 1] 
+10

+1。這太糟糕了,'lambda'和'map'被認爲是不合理的。 – outis 2010-04-07 00:02:39

+3

我不確定lambda或map本質上是不是混合的,但我同意列表理解比聯合使用它們中的兩個更清晰和更具可讀性。 – damzam 2010-04-07 02:14:43

+4

我並不認爲它們是自由的,但很多人都這麼做,包括Guido van Rossum(http://www.artima.com/weblogs/viewpost.jsp?thread=98196)。這是宗教的事情之一。 – outis 2010-04-08 01:29:02

6

如果你有幾個值替換,也可以使用字典:

a = [1, 2, 3, 4, 1, 5, 3, 2, 6, 1, 1] 
dic = {1:10, 2:20, 3:'foo'} 

print([dic.get(n, n) for n in a]) 

> [10, 20, 'foo', 4, 10, 5, 'foo', 20, 6, 10, 10] 
+1

如果在'dic'中找不到'n',這不會引發錯誤嗎? – 2016-08-17 23:17:54

+0

謝謝,你是對的,我添加了一個try-catch塊。 – roipoussiere 2016-08-18 08:41:42

+2

@ user2914540我改進了一下你的答案,所以如果找不到'n',它就可以工作。我希望你不介意。你的「嘗試/除去」解決方案不好。 – jrjc 2016-08-18 08:48:17

1

下面是一個非常Python 2.x中的直接方法

a = [1,2,3,4,5,1,2,3,4,5,1]  #Replacing every 1 with 10 
for i in xrange(len(a)): 
    if a[i] == 1: 
    a[i] = 10 
print a 

此方法的工作原理。歡迎評論。希望它有幫助:)

也嘗試瞭解如何outis'sdamzam's解決方案的工作。列表壓縮和lambda函數是有用的工具。

1
a = [1,2,3,4,5,1,2,3,4,5,1,12] 
for i in range (len(a)): 
    if a[i]==2: 
     a[i]=123 

您可以使用for和or while循環;但是如果你知道內置枚舉函數,那麼建議使用Enumerate。 1