Pythonで言語処理100本ノックを解く 02. 「パトカー」+「タクシー」=「パタトクカシーー」
Pythonで言語処理100本ノックを解いてみます。
3本目です。
環境
Ubuntu 16.04.3 LTS
Python 3.5.2
02. 「パトカー」+「タクシー」=「パタトクカシーー」
「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.
解答
# -*- coding: utf-8 -*- if __name__ == "__main__": print("".join([s1+s2 for (s1,s2) in zip("パトカー","タクシー")]))
zip とリスト内包表記を使ってワンライナーで書けます。
zipで交互に取得
zip について、公式ドキュメントには以下のように書いてあります。
この関数はタプルのイテレータを返し、その i 番目のタプルは引数シーケンスまたはイテラブルそれぞれの i 番目の要素を含みます。
つまり、複数のリストから同じインデックスの値を取得し、それぞれのタプルを返してくれるわけですね。
print(*zip("パトカー","タクシー")) # --> ('パ', 'タ') ('ト', 'ク') ('カ', 'シ') ('ー', 'ー')
あとはタプルのイテレータから全ての要素を取得して連結すればよいです。
普通に for 文で書くと以下のようになります。
result = "" for (s1, s2) in zip("パトカー","タクシー"): result += s1 + s2 print(result)
リスト内包表記で簡潔に
内包表記を使うと、ループ処理をワンライナーで書くことができます。
リスト内包表記はその名の通りリストを返すので、先ほど zip で取得したタプルの要素をリスト化できます。
[s1+s2 for (s1,s2) in zip("パトカー","タクシー")] # --> ['パタ', 'トク', 'カシ', 'ーー']
あとは、リスト内の要素を連結すればよいです。
"区切り文字".join(リスト)
で区切り文字を空にすれば単純に連結されます。
"".join([s1+s2 for (s1,s2) in zip("パトカー","タクシー")]) # --> "パタトクカシーー"
以上です。