いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【Python】リスト内包表記でFizzBuzzしたい

・お題:リスト内包表記の条件分岐でFizzBuzzしたい。

 

FizzBuzz問題は、ある数列に対して、3の倍数だとFizz、5の倍数だとBuzz、15の倍数だとFizzBuzzを返す条件分岐の問題のこと。今回は、1~100までの整数に関して実施することを考える。

・リスト内包表記を使わずにやってみると以下のような感じでできた。

for n in range(1,100+1):
    if n % 15 == 0:
        print ("FizzBuzz")
    elif n % 3 == 0:
        print("Fizz")
    elif n % 5 == 0:
        print("Buzz")
    else:
        print(n)

出力は、

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz

・・・

という感じ。

ifとelifとelseで組むことができる。

・リスト内包表記で、ifを組み合わせる例としては、以前の記事の形がある。

[n for n in range(1,10+1) if n % 2 == 0]

これを実行すると、[2, 4, 6, 8, 10]になる。

このようにifを後にくっつけると、ifがTRUEになった場合にリストにappendされるようなリスト内包表記になる。今回は、Fizzだけ、Buzzだけ、FizzBuzzだけを出力したいのではなく、あてはまらなかった場合には元の数字を返してほしいので、elseが必要になってくる。

・ifとelseをリスト内包表記で実施する場合、ifの場所はお尻ではない。

例えば、15の倍数だけFizzBuzzにして、残りを数字で返したいなら、以下の感じになる。

 ["FizzBuzz" if n % 15 == 0 else n for n in range(1,20+1)]

これを実行すると、[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 'FizzBuzz', 16, 17, 18, 19, 20]になった。

[戻り値 if 条件 else 戻り値 for ○○ in ○○]といった形で、戻り値の直後にifとelseを持ってくる必要がある。

・以上を踏まえて、お題に対する答えを考えると、以下のようになった。

 ["FizzBuzz" if n % 15 == 0 else "Fizz" if n % 3 ==0 else "Buzz" if n % 5 == 0 else n for n in range(1,100+1)]

これを実行すると、

[1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz', 11, 'Fizz', 13, 14, 'FizzBuzz', 16, 17, 'Fizz', 19, ...]

となった。

いちおうそれっぽい出力を得たようだが、なんだかとても不格好。。

 

おわり