3.7. リストの結合と文字列の分割

key=value という形式のキー値の組のリストがあり, 1 つの文字列に結合したいとします. 文字列のリストを 1 つの文字列に結合するには, 文字列オブジェクトの join メソッドを使います.

以下は buildConnectionString 関数から取った, リストの結合の例です.

    return ";".join(["%s=%s" % (k, v) for k, v in params.items()])

次に進む前に興味深いことを 1 つ指摘しておきましょう. 私は何度も, 関数はオブジェクトです, 文字列はオブジェクトです... 全てはオブジェクトです, と繰り返してきました. あなたは, 私が文字列変数はオブジェクトです, と言うのだと思ったかもしれませんが, そうではありません. この例をよく見ると, 文字列 ";" 自身がオブジェクトで, その join メソッドを呼んでいることが見て取れるでしょう.

join メソッドはセミコロンを区切り文字に使ってリストの要素を 1 つの文字列に結合します. 区切り文字がセミコロンである必要はありませんし, 1 文字である必要もありません. 任意の文字列が使えます.

Caution
join は文字列のリストに対してのみ作用します. 暗黙の型変換は一切行いません. 結合するリストに 1 つ以上の非文字列要素が含まれていると, 例外が送出されます.

Example 3.27. odbchelper.py の出力

>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> ["%s=%s" % (k, v) for k, v in params.items()]
['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> ";".join(["%s=%s" % (k, v) for k, v in params.items()])
'server=mpilgrim;uid=sa;database=master;pwd=secret'

従って, この文字列が odbchelper 関数から返され, 呼び出したコードブロックにより出力されます. この章を読み始めたときにこの出力を見たら, あなたは驚いていたかもしれませんね.

あなたはもしかしたら, 文字列を分割してリストにする類似したメソッドがないのか, と不思議に思うかもしれません. そしてそれはもちろんあって, split メソッドと言います.

Example 3.28. 文字列の分割

>>> li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> s = ";".join(li)
>>> s
'server=mpilgrim;uid=sa;database=master;pwd=secret'
>>> s.split(";")    1
['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> s.split(";", 1) 2
['server=mpilgrim', 'uid=sa;database=master;pwd=secret']
1 splitjoin とは逆に文字列を複数要素のリストに分解します. 区切り文字 (“;”) が取り除かれていることに注意してください. 区切り文字は返り値のリストのどの要素にも現れません.
2 split にはオプションの第 2 引数を渡せ, 分割回数を指定できます. (“おぉぉ, オプションの引数……” 次の章であなたの関数で使う方法を学びます.)
Tip
anystring.split(delimiter, 1) は, 文字列から部分文字列を検索して, その部分文字列より前の部分 (返り値のリストの 1 番目の要素) や後ろの部分 (2 番目の要素) に何か処理をする場合に役立つテクニックです.

文字列のメソッドについてさらに知るには

3.7.1. 文字列のメソッドの歴史についてのメモ

私が最初に Python を勉強したときは, join はリストのメソッドで, 区切り文字を引数に取るのだろうと予想していました. 多くの人々も同じように感じるようですが, join メソッドの裏にはあるストーリーがあります. Python 1.6 より前には, 文字列はこれら便利なメソッドを全て持ってはいませんでした. 文字列の関数を含む専用の string モジュールがあり, それぞれの関数は第 1 引数に文字列を取っていました. loweruppersplit のような意味が通るような関数は, 文字列のメソッドにする十分な意味があるように思えました. しかし多くのコアな Python プログラマは新しい join メソッドに, それはリストのメソッドであるべきで, そうでなければ古い string モジュール (まだ多くの有用なものを持っています) に残しておくべきです, と反対しました. 私は新しい join メソッドのみを使っていますが, あなたは他の書かれ方をしているコードを見るでしょうし, 本当に違和感があるのなら, 代わりに古い string.join 関数も使えます.