フツーって言うなぁ!

フツーなサラリーマンのフツーな嘆き.

Pythonで,文字列を構成する各文字を入れ替える

こういう細々としたネタも,書いてる人が他に見つからなさそうなら書いていくようにしたいです.

やりたかったこと

文字列sが与えられた時,sを構成する文字を入れ替えたい(例えば,'abc'の2番目の文字と3番目の文字を入れ替えて,'acb'にしたい).

Rubyなどとは違い,Pythonは文字列の変更(各要素に対する再代入)が許されていないため,そのままでは入れ替えができない.

[1] pry(main)> s = 'abc'
=> "abc"
[2] pry(main)> s[1], s[2] = s[2], s[1]
=> ["c", "b"]
[3] pry(main)> s
=> "acb" # ちゃんと入れ替わる
In [1]: s = 'abc'

In [2]: s[1], s[2] = s[2], s[1] # 要素に対しての再代入不可
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-5da7d18dd305> in <module>()
----> 1 s[1], s[2] = s[2], s[1]

TypeError: 'str' object does not support item assignment

環境はPython 2.7.5.

解決策

文字列のままでは変更できないのであれば,リストに変換すればいい.

In [11]: s = 'abc'

In [13]: list_s = list(s)

In [14]: list_s[1], list_s[2] = list_s[2], list_s[1]

In [15]: s = ''.join(list_s)

In [16]: s
Out[16]: 'acb' # ちゃんと入れ替わる

別の方法として,文字列全体に再代入して,

In [17]: s = 'abc'

In [18]: s =  '{0}{1}{2}{3}'.format(s[0:1], s[2], s[1], s[2:2])

In [19]: s
Out[19]: 'acb' # ちゃんと入れ替わる

みたいにしてもよい(少しめんどくさい気もする).

参考

文字列(3) - バリケンのPython日記 - pythonグループ

Pythonでリストの要素を一括で変換(文字列などに) | rakkyooの備忘録