学びたての認識
リストの要素(str)を連結・結合する際はjoinを使います。
>>> v = ["Hello", "Python"]
>>> "".join(v)
'HelloPython'
要素はstr型でなければいけません。
任意の文字列で連結可能です。
>>> s = ["A", "B", "C", "D"]
>>> "->".join(s)
'A->B->C->D'
リストだけじゃない
join
は引数として**iterableなオブジェクト(イテレータ)**を受け取ります。つまり、for文で回せるようなものなら引数として受け取ることができます。
リストもiterable(イテレータ)の一種で、例は先ほどあげました。
iterableなオブジェクトはその他にもいろいろあります。
- tuple
- dict
- str
- ジェネレータ式
- mapオブジェクト
- fileオブジェクト
- その他さまざまな標準ライブラリの戻り値
- 独自iterableクラス
tuple
>>> " ".join(("やせいの","ポッポ","が","あらわれた!"))
'やせいの ポッポ が あらわれた!'
dict
dictはfor文で回すとキーが取り出されます。
itemsメソッドは、キーと値がタプルで取り出されるのでそのままではjoinできません。
>>> " ".join({"a": 2, "b": 3, "c": 5, "d": 7})
'a b c d'
str
strもiterableなのでjoinできます。
>>> "・".join("ひみつ")
'ひ・み・つ'
ジェネレータ式
>>> "".join(str(c) for i in [0,90,1234,5678])
'09012345678'
たまにjoinにわざわざリスト内包表記を渡す人がいますが、ジェネレータ式が返すものはiterableなのでその必要はありません。
ジェネレータ式を使う方法は、リストに変換する処理が省かれるので、速度的にもメモリ的にも効率的です。
mapオブジェクト
>>> "".join(map(str, [0,90,1234,5678]))
'09012345678'
map関数の戻り値は、リストではなくmapオブジェクトというiterableなオブジェクトです。
list型に変更する必要はありません。
fileオブジェクト
open関数で生成されるfileオブジェクトはiterableです。for文で回すと一行ずつ取り出されます。
函館
小樽
札幌
富良野
旭川
知床
>>> print("からの".join(open("text.txt")))
函館
からの小樽
からの札幌
からの富良野
からの旭川
からの知床
その他いろいろなイテレータ
- range
- rangeは要素がintなのでjoinできません。
- filter関数の戻り値
- accumulate関数の戻り値
など。
joinのほかにもiterableを引数に受け取る関数はたくさんあります。
- filter
- sorted
- map
- sum
どの関数がiterableを受け取るのかわからないと思います。そういうときは公式サイトを見るか、
PyCharmなどのIDEを使っている場合は予測変換でiterableと出ると思います。