ni_haruのブログ

ほぼ日記

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("パトカー","タクシー")])  # --> "パタトクカシーー"

以上です。