Pythonのヒント、コツ、ハック(パート2)

内容


リスト。 リストの折りたたみ(縮小)。 リストをスクロールします(範囲、xrange、列挙)。 条件のリストのすべての要素(すべておよびすべて)をチェックします。 複数のリストの要素のグループ化(zip)。 リストを操作するための演算子がいくつかあります。 タイプが設定された高度な論理演算。

辞書 名前付き引数を使用して辞書を作成します。 辞書をリストに変換する、またはその逆を行います。 辞書内包表記。



2リスト



2.2畳み込みリスト


残念ながら、リストジェネレーターのみを使用してプログラムを記述することはできません。 (私は冗談を言っています...もちろんできます。)それらは表示およびフィルターできますが、リストを折りたたむ簡単な方法はありません。 この概念により、リストの最初の2つの要素に関数を適用し、結果の結果と次の要素に関数を適用して、リストの最後に適用することを意味します。 forループを使用してこれを実装できます。

Copy Source | Copy HTML numbers = [1,2,3,4,5] result = 1 for number in numbers: result *= number # result = 120
      
      





また、組み込みのreduce関数を使用できます。これは、2つのパラメーターとリストの関数を関数として受け取ります。

 Copy Source | Copy HTML numbers = [1,2,3,4,5] result = reduce(lambda a,b: a*b, numbers) # result = 120
      
      





リストジェネレーターほどきれいではありませんが、通常のループよりも短いです。 この方法を覚えておく価値があります。



2.3チュートリアル:範囲、xrange、列挙


Cでforループのリスト項目の代わりにカウンタ変数を使用した方法を覚えていますか? Pythonでrangeとxrangeを使用してこの動作をシミュレートする方法を既にご存じかもしれません。 値番号を範囲関数に渡すと、0からvalue-1までの要素を含むリストが取得されます。 つまり、rangeは指定された長さのリストインデックスを返します。 xrangeは同様に機能しますが、リスト全体を完全にメモリにロードすることなく、より効率的に機能します。

 Copy Source | Copy HTML strings = ['a', 'b', 'c', 'd', 'e'] for index in xrange(len(strings)): print index, #  "0 1 2 3 4"
      
      





問題は、通常、リストアイテムがまだ必要なことです。 インデックスなしのインデックスの使用は何ですか? Pythonには、インデックス→値のペアのイテレータを返すすばらしい組み込み列挙関数があります。

 Copy Source | Copy HTML strings = ['a', 'b', 'c', 'd', 'e'] for index, string in enumerate(strings): print index, string, #  "0 a 1 b 2 c 3 d 4 e"
      
      





もう1つの利点は、enumerateがxrange(len())より読みやすいことです。 したがって、おそらくrangeとxrangeはリストを最初から作成する場合にのみ有用であり、他のデータに基づいたものではありません。



2.4すべてのリスト項目の状態を確認する


少なくとも1つの要素について条件が満たされているかどうかを確認する必要があるとします。 Python 2.5以前では、次のように書くことができました。

 Copy Source | Copy HTML numbers = [1,10,100,1000,10000] if [number for number in numbers if number < 10]: print 'At least one element is over 10' # : "At least one element is over 10" <source>        ,    ,   false.       ,    true.  ,     ,     ,  .             ,      Python 2.5,        .     any,   Python 2.5,         .  any    True,    ,  .    -,   True  False   ,     any.        ,  any    . <source> Copy Source | Copy HTML numbers = [1,10,100,1000,10000] if any(number < 10 for number in numbers): print 'Success' # : "Success!"
      
      





同様に、 すべての要素が条件を満たすことを確認するタスクが発生する場合があります。 Python 2.5がない場合、次のように記述する必要があります。

 Copy Source | Copy HTML numbers = [1,2,3,4,5,6,7,8,9] if len(numbers) == len([number for number in numbers if number < 10]): print 'Success!' # : "Success!"
      
      





ここでリストをフィルタリングし、リストの長さが減少しているかどうかを確認します。 そうでない場合は、そのすべての要素が条件を満たします。 繰り返しますが、Python 2.5がなければ、これがすべてのロジックを単一の式に適合させる唯一の方法です。



Python 2.5にはもっと簡単な方法があります—組み込み関数allです。 条件を満たさない最初の要素の後にチェックを停止すると推測するのは簡単です。 この関数は、前の関数とまったく同じように機能します。

 Copy Source | Copy HTML numbers = [1,2,3,4,5,6,7,8,9] if all(number < 10 for number in numbers): print 'Success!' # : "Success!"
      
      





2.5複数のリストの要素のグループ化


組み込みのzip関数を使用して、複数のリストを1つに圧縮します。 タプルの配列を返します。n番目のタプルには、引数として渡されたすべての配列のn番目の要素が含まれます。 これは、例が最良の説明である場合です。

 Copy Source | Copy HTML letters = ['a', 'b', 'c'] numbers = [1, 2, 3] squares = [1, 4, 9] zipped_list = zip(letters, numbers, squares) # zipped_list = [('a', 1, 1), ('b', 2, 4), ('c', 3, 9)]
      
      





これは多くの場合、forループの反復子として使用され、1回の反復で3つの値を抽出します(「zipped_listの文字、数字、正方形」)。



2.6リストを操作するための演算子


以下は、反復可能なオブジェクトを引数として取る組み込み関数です。

maxとminは、それぞれ最大要素と最小要素を返します。

sumは、すべてのリストアイテムの合計を返します。 オプションの2番目のパラメーターは、初期量(デフォルトは0)を設定します。



2.7型セットを使用した高度な論理演算。


リストに関するセクションでは、セットについて説明することは想定されていません。 しかし、それらを使用するまで、リスト内のいくつかの論理演算が欠落していました。 セットは、その要素が一意で無秩序であるという点でリストとは異なります。 セットに対して多くの論理演算を実行することもできます。



かなり一般的なタスクは、リストアイテムが一意であることを確認することです。 簡単です。セットに変換し、長さが変更されたかどうかを確認するだけです。

 Copy Source | Copy HTML numbers = [1,2,3,3,4,1] set(numbers) #  set([1,2,3,4]) if len(numbers) == len(set(numbers)): print 'List is unique!' #   
      
      





もちろん、セットをリストに戻すこともできますが、要素の順序が保持されない可能性があることを忘れないでください。 ドキュメントでセットを使用した操作の詳細を見つけるでしょう。



3辞書



3.1名前付き引数を使用して辞書を作成する


Pythonを学び始めたとき、辞書を作成する別の方法を完全にスキップしました。 名前付き引数をdictコンストラクターに渡すと、それらは戻り辞書に追加されます。 もちろん、彼のキーには変数名と同じ制限が課せられます。 以下に例を示します。

 Copy Source | Copy HTML dict(a=1, b=2, c=3) #  {'a': 1, 'b': 2, 'c': 3}
      
      





このメソッドは、コードを少しクリアして、飛び回る引用符からあなたを救います。 よく使います。



3.2辞書をリストに変換する


キーのリストを取得するには、辞書をキャストしてリストを入力します。 ただし、キーのリストを取得するには.keys()を使用し、イテレーターを取得するには.iterkeys()を使用することをお勧めします。 値が必要な場合は、.values()および.itervalues()を使用します。 ただし、辞書は順序付けられていないため、結果の値は考えられるあらゆる方法で混合できることに注意してください。



キーと値の両方をタプルのリストとして取得するには、.items()または.iteritems()を使用できます。 このエキサイティングな方法を頻繁に使用した可能性があります。

 Copy Source | Copy HTML dictionary = {'a': 1, 'b': 2, 'c': 3} dict_as_list = dictionary.items() #dict_as_list = [('a', 1), ('b', 2), ('c', 3)]
      
      





3.3リストを辞書に変換する


キーと値のペアを含むリストを辞書に変換する逆の操作も同様に簡単です。

 Copy Source | Copy HTML dict_as_list = [['a', 1], ['b', 2], ['c', 3]] dictionary = dict(dict_as_list) # dictionary = {'a': 1, 'b': 2, 'c': 3}
      
      





名前付き引数を追加することでメソッドを組み合わせることができます:

 Copy Source | Copy HTML dict_as_list = [['a', 1], ['b', 2], ['c', 3]] dictionary = dict(dict_as_list, d=4, e=5) # dictionary = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
      
      





リストと辞書を互いに変換することは非常に便利です。 しかし、次のヒントは最高です。



3.3「辞書の理解」


Pythonには辞書ジェネレーターが組み込まれていませんが、コードを少し混乱させることで、同様のことができます。 .iteritems()を使用して、辞書をリストに変換し、それを式ジェネレーターまたはリストジェネレーターに渡してから、リストを変換して辞書に戻します。



name:emailペアの辞書があり、name:is_email_at_a_dot_comペアの辞書を取得するとします(サブストリング.comの出現について各アドレスをチェックします):

 Copy Source | Copy HTML emails = {'Dick': 'bob@example.com', 'Jane': 'jane@example.com', 'Stou': 'stou@example.net'} email_at_dotcom = dict( [name, '.com' in email] for name, email in emails.iteritems() ) # email_at_dotcom = {'Dick': True, 'Jane': True, 'Stou': False}
      
      





もちろん、辞書で開始および終了する必要はありません;リストはいくつかの場所で使用できます。



これは、厳密なリストジェネレーターよりも読みにくくなりますが、大きなforループよりも優れていることがわかります。



PDFの記事全文



All Articles