LoginSignup
1
0

More than 3 years have passed since last update.

リスト内包表記をつかってみた

Posted at

@shiracamus さんに教えていただいた内包表記が
かっこよかったので自分も使って見ました。

リスト内包表記を使用しない場合

# 麻雀牌のクラス
class Tile:
    def __init__(self, kind, value, pic):
        self.kind = kind  # 麻雀牌の種類(萬子・筒子・索子・四風牌・三元牌)
        self.value = value  # 麻雀牌の値(1~9 東南西北白発中)
        self.pic = pic  #画像ファイル名

        def __repr__(self):
        return f'{self.kind}, {self.value}, {self.pic}\n'

# 山牌 シャッフルされた136個のTileオブジェクトリストを返却
def create_yamahai():...

yamahai = create_yamahai() #山牌作成
haipai = []                #配牌リスト
for i in range(14):
    tile = yamahai.pop(0)  #山牌から一つ取り出す
    haipai.append(tile)    #配牌リストに加える
print(haipai)              #出力!      

出力結果は以下のようになりました。
スクリーンショット 2019-05-17 1.19.51.png

この書き方でも配牌リストを作成するっていう目標は達成できているんですが、
forループにせずにリスト内包表記で書きたいと思います。

※ちなみにですが、Tileクラスに __repr__メソッド を作成すると
printメソッドで出力するときに各オブジェクトの__repr__メソッドの結果を
出力するみたいです。
参照:https://gammasoft.jp/blog/use-diffence-str-and-repr-python/

リスト内包表記を使用した場合

リスト内包表記を使用した場合、配牌リストを一行で作成することができます。

 変更前.py
haipai = []                #配牌リスト
for i in range(14):
    tile = yamahai.pop(0)  #山牌から一つ取り出す
    haipai.append(tile)    #配牌リストに加える
 変更後.py
haipai = [yamahai.pop(0) for i in range(14)]  # 配牌リスト

ずいぶんスッキリしました!
yamahai.pop(0) 処理を
for i in range(14)ループ内にて実行する。
って意味になるんですね。

おまけ

PyCharmだと、リスト内包表記をforループに変換する機能があるみたいです。
スクリーンショット 2019-05-17 1.39.17.png
これが

スクリーンショット 2019-05-17 1.41.11.png
こうなる

最近のIDEツールはほんとにいろんな機能がありますね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0