文字列を要素とするリストは、文字列のjoinメソッドを使って、その要素を1つの文字列へと結合できる。その方法と、要素が文字列以外の場合の対応方法を紹介する。
* 本稿は2022年12月27日に公開された記事をPython 3.12.0で動作確認したものです(確認日:2023年10月04日)。
mylist = ['foo', 'bar', 'baz']
# 空文字列で要素を結合(区切り文字はない)
result = ''.join(mylist)
print(result) # foobarbaz
# ', 'を区切り文字として要素を結合
result = ', '.join(mylist)
print(result) # foo, bar, baz
# 文字列以外を要素とするリストはそのままではjoinできない
mylist = list(range(10))
print(mylist) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
result = ', '.join(mylist) # TypeError
# f文字列を使ってリストの要素を文字列に変換すればOK
result = ', '.join([f'{num:02}' for num in mylist])
print(result) # 00, 01, 02, 03, 04, 05, 06, 07, 08, 09
# map関数を使っても文字列に変換できる
result = ', '.join(map(str, mylist))
print(result) # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
result = ', '.join(map(lambda x: f'{x:02}', mylist))
print(result) # 00, 01, 02, 03, 04, 05, 06, 07, 08, 09
文字列を要素とするリスト(文字列リスト)では、文字列のjoinメソッドを使って、その要素を結合できる。このとき、要素と要素を区切る文字をjoinメソッドの呼び出しに使用する。つまり、文字列リストを結合する一般的な構文は次のようになる。
'区切り文字'.join(文字列リスト)
これはfor文を使った以下のコードと同様な処理をする。
mylist = ['foo', 'bar', 'baz']
result = ''
sep = ', '
for item in mylist:
result += item + sep
result = result[:-len(sep)] # 末尾の不要な', 'を削除
以下に例を示す。まずは区切り文字を指定しないで文字列要素を結合してみよう。
mylist = ['foo', 'bar', 'baz']
# 空文字列で要素を結合(区切り文字はない)
result = ''.join(mylist)
print(result) # foobarbaz
この例では、'foo'、'bar'、'baz'という3つの文字列を要素とする文字列リストを、区切り文字を空文字列として結合している。空文字列が区切り文字なので、3つの要素を区切る文字はないということだ。その結果、'foobarbaz'という文字列が得られている。
区切り文字があった方が読みやすい結果となることもある。そうしたときには区切り文字を空文字列以外にする。以下に例を示す。
# ', 'を区切り文字として要素を結合
result = ', '.join(mylist)
print(result) # foo, bar, baz
この例では先と同じ文字列を、今度は区切り文字を', 'として結合している。つまり、文字列と文字列がカンマと半角空白文字で区切られる。その結果、'foo, bar, baz'という文字列が得られている。
リストの要素が文字列でない場合には、joinメソッドはTypeError例外を発生させる。以下に例を示す。
mylist = list(range(10))
print(mylist) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
result = ', '.join(mylist) # TypeError
この例ではリストの要素は全て整数値である。そのため、joinメソッドで要素を結合しようとしてもTypeError例外が発生してしまう。
文字列以外のオブジェクトを要素とする配列で、その要素を結合したいのであれば、何らかの形で要素を文字列に変換すればよい。以下に例を示す。
result = ', '.join([f'{num:02}' for num in mylist])
print(result) # 00, 01, 02, 03, 04, 05, 06, 07, 08, 09
この例ではリスト内包表記とf文字列を使って先の整数リストの要素を文字列に変換している。さらに、f文字列で0埋めした2桁の文字列に変換している。そのため、'00, 01, 02, 03, 04, 05, 06, 07, 08, 09'という文字列が得られている。
このような何らかの書式指定が必要ないのであれば、map関数を使って以下のように記述してもよい。
result = ', '.join(map(str, mylist))
print(result) # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
map関数はリストの全要素に一定の処理を適用する関数だ。この場合は、str関数を指定しているので、整数リストの全要素が文字列に変換される。この結果、'0, 1, 2, 3, 4, 5, 6, 7, 8, 9'という文字列が得られている。
書式を指定したいときには、str関数ではなく、書式指定を行うラムダ式を書けばよい。以下に例を示す。
result = ', '.join(map(lambda x: f'{x:02}', mylist))
print(result) # 00, 01, 02, 03, 04, 05, 06, 07, 08, 09
この例では、各要素をf文字列化するようなラムダ式を与えているが、f文字列ではなく以下のようにformat関数を使ってもよい。自分の好きな方法で書式指定をするようにしよう。
result = ', '.join(map(lambda x: format(x, '02'), mylist))
print(result) # 00, 01, 02, 03, 04, 05, 06, 07, 08, 09
なお、文字列の結合については「文字列を結合するには」で総括的に説明をしているので、そちらも参照されたい。
Copyright© Digital Advantage Corp. All Rights Reserved.