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"]]

質問

私はforループ内でそれらを再定義するにもかかわらず、なぜ私のコードは私のsubslistsを変更しませんか? @Hammsさんのコメントに

+0

それは*だけで何が変更何か他 – davedwards

+1

に 'プリント(マイリスト)を'変えることから始め、それを印刷する*あなたがしているあなたの元list..becauseを印刷しますサブリストのコピーを作成し、新しいサブリストに再割り当てします。 – Shiping

答えて

3

ありがとう:それはサブリストする 新しいリストを割り当てると、それは単に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'に代入するとき、サブリスト自体ではなく' for'ループによって提供されたサブリストに_reference_を上書きするだけなので、オリジナルが機能しない理由があります。このメソッドは、オリジナルを変更しようとするのではなく、全く新しいリストを作成しているので機能します – 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

は、あなただけの1つのライナーでこれを行うことができます使用することができます:

[[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']] 
関連する問題