You are here: Home > Dive Into Python > 組み込みのデータ型 > リストの結合と文字列の分割 | << >> | ||||
Dive Into PythonPython from novice to pro |
key=value という形式のキー値の組のリストがあり, 1 つの文字列に結合したいとします. 文字列のリストを 1 つの文字列に結合するには, 文字列オブジェクトの join メソッドを使います.
以下は buildConnectionString 関数から取った, リストの結合の例です.
return ";".join(["%s=%s" % (k, v) for k, v in params.items()])
次に進む前に興味深いことを 1 つ指摘しておきましょう. 私は何度も, 関数はオブジェクトです, 文字列はオブジェクトです... 全てはオブジェクトです, と繰り返してきました. あなたは, 私が文字列変数はオブジェクトです, と言うのだと思ったかもしれませんが, そうではありません. この例をよく見ると, 文字列 ";" 自身がオブジェクトで, その join メソッドを呼んでいることが見て取れるでしょう.
join メソッドはセミコロンを区切り文字に使ってリストの要素を 1 つの文字列に結合します. 区切り文字がセミコロンである必要はありませんし, 1 文字である必要もありません. 任意の文字列が使えます.
join は文字列のリストに対してのみ作用します. 暗黙の型変換は一切行いません. 結合するリストに 1 つ以上の非文字列要素が含まれていると, 例外が送出されます. |
>>> 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 メソッドと言います.
>>> li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] >>> s = ";".join(li) >>> s 'server=mpilgrim;uid=sa;database=master;pwd=secret' >>> s.split(";") ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] >>> s.split(";", 1) ['server=mpilgrim', 'uid=sa;database=master;pwd=secret']
anystring.split(delimiter, 1) は, 文字列から部分文字列を検索して, その部分文字列より前の部分 (返り値のリストの 1 番目の要素) や後ろの部分 (2 番目の要素) に何か処理をする場合に役立つテクニックです. |
私が最初に Python を勉強したときは, join はリストのメソッドで, 区切り文字を引数に取るのだろうと予想していました. 多くの人々も同じように感じるようですが, join メソッドの裏にはあるストーリーがあります. Python 1.6 より前には, 文字列はこれら便利なメソッドを全て持ってはいませんでした. 文字列の関数を含む専用の string モジュールがあり, それぞれの関数は第 1 引数に文字列を取っていました. lower や upper や split のような意味が通るような関数は, 文字列のメソッドにする十分な意味があるように思えました. しかし多くのコアな Python プログラマは新しい join メソッドに, それはリストのメソッドであるべきで, そうでなければ古い string モジュール (まだ多くの有用なものを持っています) に残しておくべきです, と反対しました. 私は新しい join メソッドのみを使っていますが, あなたは他の書かれ方をしているコードを見るでしょうし, 本当に違和感があるのなら, 代わりに古い string.join 関数も使えます.
<< リストのマップ操作 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
まとめ >> |