2017-02-01 34 views
2

我有一個列表。這份名單有子列表。每個子列表都包含一個字符串。我想申請.replace()這些字符串來改變一個字母。如何替換列表中的子列表?

mylist = [["aus"],["ausser"],["bei"],["mit"],["noch"],["seit"],["von"],["zu"]] 

for sublist in mylist: 
    sublist = [stuff.replace("s", "Q") for stuff in sublist] 
print(mylist) 

但它只是返回原始列表。它應該返回

[["auQ"],["auQQer"],["bei"],["mit"],["noch"],["Qeit"],["von"],["zu"]]

問題

爲什麼沒有我的代碼改變我subslists即使我中重新定義它們的循環?

+0

它打印你原來list..because你*打印出來*,通過改變'打印(MYLIST)'別的東西 – davedwards

+1

你修改什麼開始只是子列表的副本並重新分配給新的子列表。 – Shiping

回答

3

由於@Hamms的評論:

原來不工作的原因是因爲當它分配 新列表子列表,它只是覆蓋參考由thefor提供的子表 循環,而不是子列表本身。

,此方法有效,因爲它創造了一個完全新的列表,而不是試圖修改原來的:

mylist = [["aus"],["ausser"],["bei"],["mit"],["noch"],["seit"],["von"],["zu"]] 
final = [j.replace("s", "Q") for k in mylist for j in k] 
print(final) 

輸出:

['auQ', 'auQQer', 'bei', 'mit', 'noch', 'Qeit', 'von', 'zu'] 

或者你也可以爲了有做到這一點你期望的輸出:

mylist = [["aus"],["ausser"],["bei"],["mit"],["noch"],["seit"],["von"],["zu"]] 
final = [[j.replace("s", "Q")] for k in mylist for j in k] 
print(final) 

Outpu T:

[['auQ'], ['auQQer'], ['bei'], ['mit'], ['noch'], ['Qeit'], ['von'], ['zu']] 
+0

這很聰明。我不會想到這個 –

+1

一些解釋是必要的;原始文件不起作用的原因是因爲當它將新列表分配給'sublist'時,它只是將_reference_覆蓋到'for'循環提供的子列表,而不是子列表本身。這種方法是可行的,因爲它創建了一個全新的列表,而不是試圖修改原始的 – Hamms

+0

感謝您的評論@Hamms。如果您接受它,我會將其添加到我的答案中。 –

0

可以使用

mylist = [["aus"],["ausser"],["bei"],["mit"],["noch"],["seit"],["von"],["zu"]] 

    for i in range(0,len(mylist)): 
    mylist[i] = [stuff.replace("s", "Q") for stuff in mylist[i]] 
    print(mylist) 
2

你可能只是這樣做的一個班輪:

[[s.replace("s", "Q")] for l in mylist for s in l] 
[['auQ'], ['auQQer'], ['bei'], ['mit'], ['noch'], ['Qeit'], ['von'], ['zu']] 

但發生這種情況的原因是因爲你重複創建新變量sublist而不是分配給現有的子列表。如果你想用你的方法,試試這個:

for l in mylist: 
    l[0] = l[0].replace("s", "Q") 

print(mylist) 
[['auQ'], ['auQQer'], ['bei'], ['mit'], ['noch'], ['Qeit'], ['von'], ['zu']] 

這裏,子列表來代替修改(而不是創建一個新的,修改子表)這反過來修改原始列表。

+0

想知道......是來自Python筆記本的'In [6]'嗎? –

+1

爲了清晰起見,我編輯了它,但'In'格式是從'ipython' @MateenUlhaq。如此類似於筆記本! –

1

使用map一種替代方案:

mylist = [["aus"],["ausser"],["bei"],["mit"],["noch"],["seit"],["von"],["zu"]] 

secondList = list(map(lambda l: [l[0].replace('s', 'Q')], mylist)) # python 3 
#secondList = map(lambda l: [l[0].replace('s', 'Q')], mylist) # python 2 

>>> mylist 
[['aus'], ['ausser'], ['bei'], ['mit'], ['noch'], ['seit'], ['von'], ['zu']] 
>>> secondList 
[['auQ'], ['auQQer'], ['bei'], ['mit'], ['noch'], ['Qeit'], ['von'], ['zu']]