リスト内包表記と三項演算子

     2015年2月に、おかげ様で3度目となるリギングセミナーを行います!!

     と言うことで紹介ページまであるのに、いざブログに飛んでくるとプラモデルの製作日記ばかり・・・ではちょっとアレなんで、たまには技術的な話でも(ものすごい消極的理由)

     今回は今更ではありますがPythonの超絶便利機能「リスト内包表記」と、あんまり関係ないですけどやっぱり便利な三項演算子について



    ■リスト内包表記
     通常リストに何らかしらの処理したものを入れたい場合for文を使用します。
     たとえば0~10000000の数字のリストの各要素を二乗したものを新たなリストに入れたい場合
    # 二乗の結果をリストに入れる
    
    result = []
    for i in range(0, 10000000):
        result.append(i * i)
    
    となりますね。

     これをリスト内包表記で記述するとこうなります。
    # 二乗の結果をリストに入れる(リスト内包表記版)
    
    result = [x * x for x in list(0, 10000000)]
    
    for文で処理する中身を先に記述し、その後ろにfor文を書いて[]で囲むだけですね。慣れれば非常に簡単です。


    上記2つの動作時間を計測してみた結果、ウチの環境では
     通常記述方法 : 2.3秒
     リスト内包表記 : 1.8秒
    
     なんと1.27倍も早くなってます!! これはかなり違いますね!!!


     リスト内包表記にはif文も使用する事ができます。
    # if文付きリスト内包表記
    
    result = [x * x for x in range(0, 10000000) if x % 2]
    
     これを通常の記述方法にすると
    # 二乗の結果をリストに入れる - if文付きバージョン
    
    result = []
    for i in range(0, 10000000):
        if i % 2:
            result.append(i * i)
    
     if文を加えるとだいぶ表記の長さが変わりますね。


     リスト内包表記は二重にかけることもできます。
    # ダブルリスト内包表記(←正式名称ではありません)
    
    import string
    result = ['%s - %s' % (x, y) for x in range(0, 10) for y in list(string.lowercase)]
    
    これを通常表記で書くと
    import string
    
    result = []
    for x in range(0, 10):
        for y in list(string.lowercase):
            result.append('%s - %s' % (x, y))
    

     だいぶ行数は増えます。また処理速度も必然的に増えますね。
     リスト内包表記は何重にもかける事ができますが、あまりかけすぎると可読性がかなり下がってしまうので、せいぜい二重掛けくらいにとどめておいたほうがいいでしょう。(Googleの構文ガイドラインでもそのように言ってるし・・・)



    ■三項演算子
     Pythonでも三項演算子は存在しますが、記述方法がちょっと他のスクリプトとは違います。
    # aには2が入る。 
    
    a = 2 if True else 1
    
     三項演算子は分岐による取得を1行で書くことが出来ます。
    (真の時の値) if (条件) else (偽の時の値)
    
    これを通常の書き方にすると
    # aには2が入る。 
    
    if True:
        a = 2
    else:
        a = 1
    
    になります。

     因みに処理速度の方ですが、ウチの環境では通常の書き方の方がわずかに早いようでした。う〜む、謎だ・・・


     もちろんリスト内包表記と三項演算子は同時に使用する事が出来るので、こじらせるとこんなんなります。
    # リスト内包表記 + 三項演算子
    
    import string
    result = [x if x * x < 20 else '%s%s' % (x, y) for x in range(10) if x % 2 for y in list(string.lowercase[:3])]
    
    同じ事を通常の書き方にすると
    # 通常バージョン
    
    import string
    result = []
    for x in range(10):
        if x % 2:
            for y in list(string.lowercase[:3]:
                if x * x < 20:
                    result.append(x)
                else:
                    result.append('%s%s' % (x, y))
    
     かなり長さが変わります。たった1行でこんな処理が出来てしまうPython恐るべし・・・
     ただし上のようにリスト内包表記や三項演算子をフル活用してしまうとメンテナンスの時や、他に人に引き継ぐ時に非常に読みづらくなってしまうので、使用はほどほどにしましょうw
    スポンサーサイト

    コメントの投稿

    非公開コメント

    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココのメールアドレスからご連絡できますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR