主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

FizzBuzzのリスト内包表記

                
tags:
FizzBuzzの話で盛り上がったので、電車の中で考えていた。そういえばpythonにはリスト内包があったなと。というわけでリスト内包表記でFizzBuzz。FizzBuzzリストをつくる。
True*3は3、True*"string"は"string"になり、False*3は0、False*"string"は""になる。ここではTrueやFalseに文字列をかけて、さらにそれを連結することでFizzBuzzを実装している。

print [((((k % 3) != 0) and ((k % 5) != 0)) * str(k)) + ((k % 3) == 0) * 'Fizz' + ((k % 5) == 0) * 'Buzz' for k in range(1,101)]




'11/10/11追記
http://d.hatena.ne.jp/m_yamamo0417/20091008/1255012665
リスト内包表記でFizzBuzzリストをより効率的に作っているのがあった。どうやら一つの式の中で"=="や"!="を書き連ねて毎回すべての条件を検証するより、ifを使って分岐させ、必要がなくなった検証は省いていく方が効率がいいようだ。速度検証スクリプト↓。上側がリンク先のブログで見たリスト内包表記で、下側が私の表記。処理時間はスクリプトの下に。

import time

t1=0;t2=0;
for x in range(1,100):

t=time.time()
str(['FizzBuzz' if x % 3 == 0 and x % 5 == 0 else 'Fizz' if x % 3 == 0 else 'Buzz' if x % 5 == 0 else x for x in range(1, 101)])
t1 += time.time()-t

t=time.time()
[((((k % 3) != 0) and ((k % 5) != 0)) * str(k)) + ((k % 3) == 0) * 'Fizz' + ((k % 5) == 0) * 'Buzz' for k in range(1,101)]
t2 += time.time()-t

print t1,t2

結果
if分岐によるリスト内包表記:0.00699973106384s
等価演算子と非等価演算子によるリスト内包表記0.0110003948212s



ちょっと悔しかったのでさらに効率化を図ってみた。1から100のうちFizzにもBuzzにもならず数字が表示される回数は53回である。半分以上である。なら数字が表示される条件の検証を先に持っていけば、1から100のうち半分以上は1度も分岐せずに数字をリストに入れるだけで処理が終わる。ただ約数が3でも5でも余りが出ることを確認しなければならなくなるが。とりあえず書いて検証してみたところ、わずかながら処理は速くなった。わずかながら。

[str(x) if ((x % 3) and (x % 5)) else 'FizzBuzz' if x % 3 == 0 and x % 5 == 0 else 'Fizz' if (x%3==0) else 'Buzz' for x in range(1, 101)]


import time

t1=0;t2=0;
for x in range(1,10000):

t=time.time()
[str(x) if ((x % 3) and (x % 5)) else 'FizzBuzz' if x % 3 == 0 and x % 5 == 0 else 'Fizz' if (x%3==0) else 'Buzz' for x in range(1, 101)]
t1 += time.time()-t


t=time.time()
['FizzBuzz' if x % 3 == 0 and x % 5 == 0 else 'Fizz' if x % 3 == 0 else 'Buzz' if x % 5 == 0 else str(x) for x in range(1, 101)]
t2 += time.time()-t

print t1,t2

効率化後:0.58399939537s
効率化前:0.609001159668s


'12/01/10追記
どうにも見栄えのわるいコードだったのをさらに書き換えた。たぶんこれがベストだと思う。http://elicon.blog57.fc2.com/blog-entry-78.html
[((k%3==0) * 'Fizz' + (k%5==0) * 'Buzz') or k for k in range(1,101)]
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。