[解決!Python]リスト(配列)の要素を文字列のjoinメソッドで結合するには解決!Python

文字列を要素とするリストは、文字列のjoinメソッドを使って、その要素を1つの文字列へと結合できる。その方法と、要素が文字列以外の場合の対応方法を紹介する。

» 2023年10月04日 05時00分 公開
[かわさきしんじDeep Insider編集部]
「解決!Python」のインデックス

連載目次

* 本稿は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


 なお、文字列の結合については「文字列を結合するには」で総括的に説明をしているので、そちらも参照されたい。

「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。