2015-12-01 205 views
0

這是我的Python代碼(我使用Python 2.7.6):列表項字後,來刪除逗號

cn = ['here,', 'there'] 
>>> for c in cn: 
    if c.endswith(','): 
     c = c[:-1] 

>>> print(cn) 
['here,', 'there'] 

正如你所看到的,cn[0]還有後面的逗號,即使我做了c = c[:-1] 。我如何更改cn[0],使其等於'here'而沒有尾隨逗號?

+1

@juanchopanza不能同意你的意見;這裏的問題不是如何去掉逗號,而是如何改變列表元素。 –

+0

@LevLevitsky是的,我傾向於同意。 – juanchopanza

回答

5

問題是,您爲c指定了一個新值,但不更新列表。 爲了操作列表中的地方,你需要做這樣的事情:

cn = ['here,', 'there'] 
for index, c in enumerate(cn): 
    if c.endswith(','): 
     cn[index] = c[:-1] 

print(cn) 
['here', 'there'] 

枚舉讓你列表中的所有元素,用他們的指數一起,然後,如果字符串末尾有逗號你只需更新列表元素和正確的索引。

您的代碼的問題是,c只是簡單地持有字符串'here,'。然後,您創建了一個新的字符串,並用逗號將其分配到c,但這並未影響列表cn。爲了對列表產生任何影響,您需要將新值設置在所需位置。

你也可以使用列表理解才達到這可能是這樣一個小任務更Python相同的結果:(由@AdamSmith提到的)

cn = [c[:-1] if c.endswith(',') else c for c in cn] 

這確實從cn每個創建一個新的列表如果元素不以,結束,則返回元素,否則在返回字符串之前切斷逗號。

您可以使用的另一件事是內置的rstrip函數,但它將刪除所有的測試逗號,而不僅僅是一個。它看起來像這樣(再次@AdamSmith指出了這一點):

cn = map(lambda x: x.rstrip(','), cn) 
+0

也許告訴**爲什麼**會很有價值?在這裏描述可變對象(列表)和不可變(字符串)之間的區別? – lejlot

+0

@TessellatingHeckler這不適用於此。問題在於,如果在迭代時對列表**進行變更,因爲它會改變迭代的長度和結果。通過改變您正在迭代的值,完全沒有問題。這就是你迭代95%的時間。這些鏈接問題的一些答案完全是做這件事的。 –

+0

當然,使用'list(map(...))'這個函數肯定是不可思議的,但是我更願意看到'cn = [c [: - 1] if c.endswith(',')else c for c in cn]列表comp比你上面的for循環。 –

1

你做了什麼是複製串編輯,並將其存儲在一個名爲c新的變量,用同一個衝突名稱原始c並覆蓋它。

由於您沒有更改原始文件,因此當新文件超出範圍並被清除時,它保持不變。

你可以做這樣的事情做出一個新的列表,包含改變後的字符串:

newlist = [c.strip(',') for c in cn] 

或者,更貼近您的例子,同時保持這種方法:

cn = [c[:-1] if c.endswith(',') else c for c in cn] 

交替循環在另一個答案中使用枚舉方法是可行的,但是我避免了這種方法,因爲一般來說,在迭代它們的同時更改列表可能會導致錯誤,除非仔細地進行,這使我認爲在遇到還有另一個合理的整潔a接近角。

+1

複製列表(數據)與變換一個元素不一樣 – kwarunek

+2

這將刪除* all *逗號。該OP僅帶1. –

+0

@ZachGates在字符串的開頭還有逗號。 – jpmc26

0

您正在更改循環變量c,但您不更改列表cn。要更改列表cn,而不是循環通過其,則循環通過其索引。這是一個實現。

for c in range(len(cn)): 
    if cn[c].endswith(','): 
     cn[c] = cn[c][:-1] 
+0

在Python中看到這種類型的結構很奇怪。你應該更喜歡'對於idx,enumerate(cn)'的值'。 –

+0

@AdamSmith哇,我從來沒有這樣想過!另一個Python技術添加到我的大腦中... –