Pythonの基本-簡単に。 パート4.リストジェネレーター

リスト内包表記



レッスンのサイクルを継続します。 こんにちは



リスト生成



リストの生成(リストの内包表記をロシア語に適切に翻訳する方法がわかりません)は、「構文糖衣」の鮮やかな例です。 つまり、簡単にできる設計ですが、それではるかに優れています:)リストジェネレーターは、奇妙なことではないため、新しいリストの作成や既存のリストの変更など、便利なリスト処理を目的としています。

25を超えない奇数のリストを取得する必要があるとします。

原則として、この問題を解決するためにxrangeチームの仕事に精通することは難しくありません。



  >>> res = []
 >>> xrange(1、25、2)のxの場合:
 ... res.append(x)
 ...
 >>>印刷解像度 


一般的に、得られた結果-長い記録を除くすべてに満足しています。 砂糖が助けになります 最も単純な形式では、通常は



  >>> res = [xrangeのxのx(1、25、2)]
 >>>印刷解像度
 [1、3、5、7、9、11、13、15、17、19、21、23] 


構文は基本的に簡単です。 式全体は角括弧で書かれています。 最初にリストアイテムを設定する式があり、次に式を変更できるループがあります。 両方の部分を任意に複雑にすることができます。 たとえば、同じ奇数の正方形のリストを取得する方法は次のとおりです。



  >>> res = [x ** 2 in xrange(1、25、2)]
 >>>印刷解像度
 [1、9、25、49、81、121、169、225、289、361、441、529] 


オプションで、追加のフィルタリング条件を追加できます。 たとえば、3の倍数である数値の2乗が除外されるように、前の例を変更します。



  >>> res = [x%3!= 0の場合、xrange(1、25、2)のxに対してx ** 2]
 >>>印刷解像度
 [1、25、49、121、169、289、361、529] 


次に、もう少し複雑な例を示します。



  >>> dic = {「ジョン」:1200、「ポール」:1000、「ジョーンズ」:1850、「ドロシー」:950}
 >>> "\ n" .join(["%s =%d"%(名前、給与)は名前、dic.itemsの給与()])を出力します
ジョーンズ= 1850
ドロシー= 950
ポール= 1000
ジョン= 1200 


ここでは、リストジェネレーターを使用して、辞書をレコードのセットに変換しました;これは、構成の保存やHTMLの生成などのタスクに便利です。 式 "%s =%d"%(名前、給与)-文字列のフォーマットを目的としており、本質的にはCの類似物に似ています。最初に、値を挿入する位置を指定する行があります(%s-文字列、%d-数値) 。 %記号の後-タプル形式の「挿入」値。



原則として、ジェネレーターは既製のリストも処理できます。



簡単な例を考えてみましょう。 サーバーへの要求の統計を、スペースで区切られた「ipバイト」の形式で保存するログファイルがあるとします。

文字列。 このようなもの:



  127.0.0.1 120
 10.1.1.1 210
 127.0.0.1 80
 10.1.1.1 215
 10.1.1.1 200
 10.1.1.2 210 


各ホストのトラフィックの合計量を計算し、トラフィックの降順でリストとして発行する必要があります。

この問題を解決するためのプログラムは非常に短いです:)さらに削減することもできますが、これは明らかに可読性を損なうことになります。



  #!/ usr / bin / env python
 #coding:utf8

 #1ファイルから行を読み取り、IPアドレスのペアに分割します
 raw = [x。for open( "log.txt")]の[x.split( "")]

 #2辞書に記入する
 rmp = {}
 ipの場合、rawのトラフィック:
         rmpのipの場合:
                 rmp [ip] + = int(トラフィック)
        その他:
                 rmp [ip] = int(トラフィック)

 #3リストへの翻訳と並べ替え
 lst = rmp.items()
 lst.sort(key = lambda(key、val):key)
 #4結果を得る
 print "\ n" .join(["%s \ t%d"%(host、traff)for host、traff in lst]) 


段階的に分析してみましょう。

1.この行では、open関数を使用して開いたファイルから読み取ります。 open関数は、デフォルトで、読み取りのためにファイルを開き、ファイルオブジェクトを返します。これは、とりわけ反復可能です。 つまり、ここで使用するforループを使用して、「移動」できます。 さらに、分割方法を使用して、各行をアドレスとトラフィックのペアに分割します。

2.便宜上、ハッシュを作成します。キーはアドレス、値はトラフィックです。 キーがまだない場合は作成し、キーがある場合は、現在のトラフィックを以前の「開発」に追加します。 このサイクルの後、すべてのホストのトラフィック量を含むハッシュを取得します。

3.残念ながら、Pythonの辞書はソートされていません。 したがって、ソートのためにリストに転送する必要があります。 次の2行は、辞書をリストに変換し、2番目のフィールドでソートします。

4.残っているのはそれだけです-以前に行ったように、結果を「収集」します。



今日はこれで十分です:)

宿題。

1.数値Xの乗算テーブルを使用して行ジェネレーター関数を実装します。

2.チャットのログファイルがあります。 ニックネームの形でその中のユーザーの「おしゃべり」を計算する-フレーズの数。 チャット参加者ごとの文字の平均数を計算します。



脅威継続する方が良いのは、クラスとOOPについて、または関数型プログラミングの要素についてですか?



All Articles