2017-02-01 4 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 т:

[['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

Просто интересно ... это 'In [6]' из ноутбука Python? –

+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']] 
Смежные вопросы