2016-09-25 44 views
0

我正在從文本文件中讀取數據,因此每行都是一個字符串列表,並且所有這些列表都在數據列表中。所以我的列表如下所示:替換for循環中的字符串元素Python

data = [row1, row2, etc.] 
row1 = [str1, str2, etc.] 

我試圖刪除出現在行列表中的字符串中的任何$或%符號。我已籤,如果我嘗試做這一個單獨的元素,說第二行的第四個元素具有「%」,所以:

data[1][3] = data[1][3].replace("%","") 

這將正確刪除它,但是當我嘗試和使用嵌套for循環做這一切:

for row in data: 
    for x in row: 
     x = x.replace("%","") 
     x = x.replace("$","") 

這不會刪除任何%或$的跡象,我曾嘗試只是在做它沒有第二更換,看它是否會至少刪除%徵兆,但即使這樣也行不通。

任何想法,爲什麼這不起作用,或者我怎麼能做到這一點?
在此先感謝您的幫助!

+1

請不要用'str'的​​名字在Python中的一個變量。這也是一個功能! – dawg

+4

'for-in'不影響實際列表,因爲元素被存儲/複製到一個變量中,它不是一個直接引用。使用枚舉和訪問列表。 – Li357

+0

我會更新,我沒有在我的代碼中真正擁有它,我只是爲了清晰起見而這樣寫的。 –

回答

1

問題是,你的str變量是影響內置Python str變量。該修復很容易。只需使用另一個變量名稱。

第二個問題是被替換的字符串在行列表本身中沒有被替換。修復方法是將替換的字符串保存回列表中。對於這一點,你可以使用enumerate()給你倆的價值和它的行中的位置:

for row in data: 
    for i, x in enumerate(row): 
     x = x.replace("%","") 
     x = x.replace("$","") 
     row[i] = x 
+0

這是* only *問題嗎? – Li357

+1

使用名稱'str'是一種代碼氣味,但它不會阻止它的工作。 – jez

+0

我剛剛更新了它,我實際上並沒有將它作爲str代碼,我正在這裏寫下來試圖清楚說明我正在循環的內容。 –

0

您分配一個新值名稱x但這並不改變rowdata內容。在更改x後,您需要爲適當的列索引j(和行索引i)分配row[j] = xdata[i][j] = x。另見你python 3: lists dont change their values

0

此外,在這種情況下,你可以使用列表理解

data = [[item.replace("%", "").replace("$", "0") for item in row] for row in data] 
+0

什麼是_list expressions_?你的意思是[_list comprehension_](https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions)? –

+0

當然,這是我的錯誤。謝謝。 –