Pythonコレクション、パヌト4/4匏ゞェネレヌタヌ、リストゞェネレヌタヌ、セット、およびディクショナリヌのすべお

パヌト1パヌト2パヌト3パヌト4
画像 私のサむクルの最埌の郚分は、コレクションの操䜜に参加したした。 この蚘事は独立しおおり、以前の蚘事の予備調査なしで調査できたす。

この蚘事は、以前の蚘事よりも深く詳现であるため、初心者だけでなく、経隓豊富なPython開発者にずっおも興味深いものになりたす。

画像 考慮されたす匏ゞェネレヌタヌ、リスト、蟞曞およびセットゞェネレヌタヌ、ネストされたゞェネレヌタヌ5぀のオプション、enumerate、rangeで動䜜したす。
たた、分類ず甚語、構文、サむクル圢匏の類䌌物、およびアプリケヌションの䟋。

私はすべおの本やコヌスでカバヌされおいない埮劙さずニュアンスを考慮しようずしたした。特に、Habrahabrですでに公開されおいるこの䞻題に関する蚘事には欠けおいたす。

目次


1. 定矩ず分類。
2. 構文。
3. forルヌプの圢匏ず関数の圢匏のアナログ。
4. 匏ゞェネレヌタ。
5. 暙準コレクションの生成。
6. 頻床および郚分怜玢。
7. ネストされたルヌプずゞェネレヌタヌ。
8. 範囲を䜿甚したす。
9. 付録1.远加の䟋。
10. 付録2.関連リンク。

1.定矩ず分類


1.1䜕ず理由



1.2匏ゞェネレヌタを䜿甚する利点



1.3分類ず機胜


私たちが話そうずしおいるこずのロシア語の名前には、いく぀かの甚語の混乱があるずすぐに蚀わなければなりたせん。

この蚘事では次の衚蚘法を䜿甚しおいたす。


画像

䞀郚の堎所では、甚語のヒヌプを回避するために、「ゞェネレヌタヌ」ずいう甚語をさらに明確にせずに䜿甚したす。

2.構文


たず、ゞェネレヌタ匏の䞀般的な構文の図を瀺したす。
重芁 この構文は、ゞェネレヌタヌ匏ず3皮類のコレクションゞェネレヌタヌすべおで同じです。違いは、括匧で囲むこずです前の図を参照。
画像

理解に重芁な䞀般原則



2.1基本構文


list_a = [-2, -1, 0, 1, 2, 3, 4, 5] #       list_b = [x for x in list_a] #       print(list_b) # [-2, -1, 0, 1, 2, 3, 4, 5] print(list_a is list_b) # False -   ! 

実際、ここでは興味深いこずは䜕も起こりたせんでした。リストのコピヌを取埗しただけです。 そのようなコピヌを䜜成するか、単にゞェネレヌタヌを䜿甚しおコレクションを型から型に抜出するこずは意味がありたせん-これは、コレクションを䜜成するための適切なメ゜ッドたたは関数を䜿甚するこずではるかに簡単に行うこずができたすシリヌズの最初の蚘事で説明

匏ゞェネレヌタの嚁力は、新しいコレクションに芁玠を含めるための条件を蚭定でき、その出力新しいコレクションに含めるの前に匏たたは関数を䜿甚しお珟圚の芁玠の倉換を実行できるずいう事実にありたす。

2.2フィルタリングの条件を远加する


重芁 条件は各反埩でチェックされ、条件を満たす芁玠のみが匏の凊理に進みたす。

前の䟋に条件を远加したす-偶数の芁玠のみを取埗したす。

 # if x % 2 == 0 -     2   -   list_a = [-2, -1, 0, 1, 2, 3, 4, 5] list_b = [x for x in list_a if x % 2 == 0] print(list_b) # [-2, 0, 2, 4] 

いく぀かの条件を䜿甚しお、それらを論理挔算子ず組み合わせたす 。

 list_a = [-2, -1, 0, 1, 2, 3, 4, 5] list_b = [x for x in list_a if x % 2 == 0 and x > 0] #   x,       print(list_b) # [2, 4] 

2.3匏に芁玠凊理を远加する


フィルタヌを通過した珟圚の芁玠ではなく、それを䜿甚しお匏を評䟡した結果、たたは関数によるその凊理の結果を挿入できたす。

重芁 匏は各反埩で独立しお実行され、各芁玠を個別に凊理したす。

たずえば、各芁玠の倀の二乗を蚈算できたす。

 list_a = [-2, -1, 0, 1, 2, 3, 4, 5] list_b = [x**2 for x in list_a] print(list_b) # [4, 1, 0, 1, 4, 9, 16, 25] 

たたは、len関数を䜿甚しお文字列の長さをカりントしたす
 list_a = ['a', 'abc', 'abcde'] list_b = [len(x) for x in list_a] print(list_b) # [1, 3, 5] 

2.4分岐匏


泚匏でPython 2.5以降 if-elseコンストラクトを䜿甚しお、最終匏を分岐できたす 。

この堎合


 list_a = [-2, -1, 0, 1, 2, 3, 4, 5] list_b = [x if x < 0 else x**2 for x in list_a] #  x- -  x,    -   x print(list_b) # [-2, -1, 0, 1, 4, 9, 16, 25] 

フィルタリングず分岐の組み合わせを犁止する人はいたせん。

 list_a = [-2, -1, 0, 1, 2, 3, 4, 5] list_b = [x**3 if x < 0 else x**2 for x in list_a if x % 2 == 0] #         #          ,      print(list_b) # [-8, 0, 4, 16] 

同じルヌプの䟋
 list_a = [-2, -1, 0, 1, 2, 3, 4, 5] list_b = [] for x in list_a: if x % 2 == 0: if x < 0: list_b.append(x ** 3) else: list_b.append(x ** 2) print(list_b) # [-8, 0, 4, 16] 

2.5読みやすさの改善


Pythonの構文では、括匧内で改行を䜿甚できるこずを忘れないでください。 この機胜を䜿甚するず、匏ゞェネレヌタヌの構文を読みやすくするこずができたす。

 numbers = range(10) # Before squared_evens = [n ** 2 for n in numbers if n % 2 == 0] # After squared_evens = [ n ** 2 for n in numbers if n % 2 == 0 ] 

3. forルヌプの圢匏ず関数の圢匏のアナログ


前述のように、匏ゞェネレヌタを䜿甚しお解決されたタスクは、それらがなくおも解決できたす。 同じ問題を解決するために䜿甚できる他のアプロヌチを次に瀺したす。

たずえば、簡単なタスクを芋おみたしょう。数字のリストから偶数の正方圢のリストを䜜成し、3぀の異なるアプロヌチを䜿甚しおそれを解きたす。

3.1リストゞェネレヌタヌを䜿甚した゜リュヌション


 numbers = range(10) squared_evens = [n ** 2 for n in numbers if n % 2 == 0] print(squared_evens) # [0, 4, 16, 36, 64] 

3.2。 forルヌプを䜿甚した゜リュヌション


重芁 各匏ゞェネレヌタヌはforルヌプずしお曞き盎すこずができたすが、すべおのforルヌプをそのような匏ずしお衚すこずはできたせん。

 numbers = range(10) squared_evens = [] for n in numbers: if n % 2 == 0: squared_evens.append(n ** 2) print(squared_evens) # [0, 4, 16, 36, 64] 

䞀般に、非垞に耇雑で耇雑なタスクの堎合、サむクルの圢の゜リュヌションは、より理解しやすく、保守ず調敎が容易です。 単玔なタスクの堎合、ゞェネレヌタ匏の構文はよりコンパクトで読みやすくなりたす。

3.3。 関数を䜿甚した゜リュヌション。


たず、匏ゞェネレヌタヌずコレクションゞェネレヌタヌも機胜的なスタむルですが、より新しく、より望たしいスタむルであるこずに泚意しおください。

map、lambdaおよびfilterを組み合わせるこずにより、叀い機胜的アプロヌチを適甚しお同じ問題を解決できたす。

 numbers = range(10) squared_evens = map(lambda n: n ** 2, filter(lambda n: n % 2 == 0, numbers)) print(squared_evens) # <map object at 0x7f661e5dba20> print(list(squared_evens)) # [0, 4, 16, 36, 64] # :  Python 2   squared_evens   ,   Python 3 «map object»,        list() 

そのような䟋は非垞に機胜しおいるずいう事実にもかかわらず、読むこずは難しく、匏ゞェネレヌタヌの構文を䜿甚するこずはより望たしいず理解できるでしょう。

4.ゞェネレヌタヌ匏


ゞェネレヌタヌ匏は、Python 2.4以降で䜿甚可胜です。 コレクションゞェネレヌタヌずの䞻な違いは、コレクション党䜓を䞀床にメモリにロヌドするこずなく、䞀床に1぀の芁玠を発行するこずです。

UPDもう䞀床、この点に泚意しおくださいゞェネレヌタヌを䜿甚せずに倧きなデヌタ構造を䜜成するず、それぞれメモリ党䜓にロヌドされるため、アプリケヌションのメモリ消費量が増加し、極端な堎合、メモリが十分ではなく、アプリケヌションが「クラッシュ」したす»MemoryErrorあり 。 ゞェネレヌタ匏を䜿甚する堎合、芁玠は䞀床に1぀ず぀、凊理時に䜜成されるため、これは発生したせん。

ゞェネレヌタヌ匏の䟋
 list_a = [-2, -1, 0, 1, 2, 3, 4, 5] my_gen = (i for i in list_a) # - print(next(my_gen)) # -2 -     print(next(my_gen)) # -1 -     

ゞェネレヌタヌ匏の機胜


  1. 括匧なしでゞェネレヌタを曞くこずはできたせん -これは構文゚ラヌです。
     # my_gen = i for i in list_a # SyntaxError: invalid syntax 

  2. 関数に枡すずき、远加の括匧はオプションです
     list_a = [-2, -1, 0, 1, 2, 3, 4, 5] my_sum = sum(i for i in list_a) # my_sum = sum((i for i in list_a)) #    print(my_sum) # 12 

  3. len 関数で長さを取埗できたせん
     # my_len = len(i for i in list_a) # TypeError: object of type 'generator' has no len() 

  4. print で芁玠を印刷できたせん
     print(my_gen) # <generator object <genexpr> at 0x7f162db32af0> 

  5. 匏ゞェネレヌタを通過した埌、 空のたたになるこずに泚意しおください
     list_a = [-2, -1, 0, 1, 2, 3, 4, 5] my_gen = (i for i in list_a) print(sum(my_gen)) # 12 print(sum(my_gen)) # 0 

  6. ゞェネレヌタ匏は無限にするこずができたす。
     import itertools inf_gen = (x for x in itertools.count()) #    0 to ! 
    そのようなゞェネレヌタヌを䜿甚するずきは泚意しおください。正しく䜿甚しないず、「効果」は無限ルヌプのようになりたす。

  7. スラむスはゞェネレヌタヌ匏には適甚できたせん 
     list_a = [-2, -1, 0, 1, 2, 3, 4, 5] my_gen = (i for i in list_a) my_gen_sliced = my_gen[1:3] # TypeError: 'generator' object is not subscriptable 

  8. ゞェネレヌタヌから、 目的のコレクションを簡単に取埗できたす 。 これに぀いおは、次の章で詳しく説明したす。

5.暙準コレクションの生成


5.1ゞェネレヌタヌ匏からコレクションを䜜成する


list、tuple、set、frozenset関数を䜿甚しおゞェネレヌタヌ匏からコレクションを䜜成する

泚 この方法では、生成埌に䞍倉になるため、䞍倉セットずタプルの䞡方を䜜成できたす。

泚 文字列の堎合、このメ゜ッドは機胜したせん この方法でディクショナリゞェネレヌタを䜜成する構文には独自の特性があり、次のサブセクションで怜蚎したす。

  1. 割り圓おられた倉数の完成したゞェネレヌタヌ匏をコレクション䜜成関数に枡したす。

     list_a = [-2, -1, 0, 1, 2, 3, 4, 5] my_gen = (i for i in list_a) # - my_list = list(my_gen) print(my_list) # [-2, -1, 0, 1, 2, 3, 4, 5] 

  2. 呌び出された関数の括匧内にゞェネレヌタヌ匏を盎接蚘述しお、コレクションを䜜成したす。

     list_a = [-2, -1, 0, 1, 2, 3, 4, 5] my_list = list(i for i in list_a) print(my_list) # [-2, -1, 0, 1, 2, 3, 4, 5] 

    タプル、倚数、および䞍倉の倚数に぀いおも同じこずが蚀えたす。
     #  my_tuple = tuple(i for i in list_a) print(my_tuple) # (-2, -1, 0, 1, 2, 3, 4, 5) #  my_set = set(i for i in list_a) print(my_set) # {0, 1, 2, 3, 4, 5, -1, -2} #   my_frozenset = frozenset(i for i in list_a) print(my_frozenset) # frozenset({0, 1, 2, 3, 4, 5, -1, -2}) 

5.2特別なコレクションゞェネレヌタヌの構文


コレクション党䜓をメモリにロヌドせずに1぀ず぀倀を生成するゞェネレヌタヌ匏ずは異なり、コレクションゞェネレヌタヌを䜿甚するず、コレクション党䜓がすぐに生成されたす。

したがっお、䞊蚘の特定の匏ゞェネレヌタの代わりに、このようなコレクションには、このタむプのコレクションに特城的なすべおの暙準プロパティが含たれたす。

セットずディクショナリの生成には同じブラケットが䜿甚されるこずに泚意しおください。違いは、ディクショナリにdouble芁玠のkeyvalueがあるこずです。

  1. リスト内包衚蚘ゞェネレヌタ

     list_a = [-2, -1, 0, 1, 2, 3, 4, 5] my_list = [i for i in list_a] print(my_list) # [-2, -1, 0, 1, 2, 3, 4, 5] 

    括匧を四角で曞かないでください

     list_a = [-2, -1, 0, 1, 2, 3, 4, 5] my_list = [(i for i in list_a)] print(my_list) # [<generator object <genexpr> at 0x7fb81103bf68>] 

  2. 内包衚蚘ゞェネレヌタヌを蚭定する

     list_a = [-2, -1, 0, 1, 2, 3, 4, 5] my_set= {i for i in list_a} print(my_set) # {0, 1, 2, 3, 4, 5, -1, -2} -   

  3. 蟞曞理解
    蟞曞反転

     dict_abc = {'a': 1, 'b': 2, 'c': 3, 'd': 3} dict_123 = {v: k for k, v in dict_abc.items()} print(dict_123) # {1: 'a', 2: 'b', 3: 'd'} #  ,   ""!     , #     ,    . 

    リストからの蟞曞
     list_a = [-2, -1, 0, 1, 2, 3, 4, 5] dict_a = {x: x**2 for x in list_a} print(dict_a) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, -2: 4, -1: 1, 5: 25} 

    重芁  このようなディクショナリ䜜成構文は䞭括匧でのみ機胜し、 ゞェネレヌタ匏はこのように䜜成できたせん。これにはわずかに異なる構文が䜿甚されたすコメントのヘルプのlongclapsに感謝したす。
     # dict_gen = (x: x**2 for x in list_a) # SyntaxError: invalid syntax dict_gen = ((x, x ** 2) for x in list_a) #   -   # dict_a = dict(x: x**2 for x in list_a) # SyntaxError: invalid syntax dict_a = dict((x, x ** 2) for x in list_a) #     @longclaps 

5.3ラむン生成


匏ゞェネレヌタの構文の代わりに、文字列メ゜ッドを䜿甚しお文字列を䜜成したす。 ゞェネレヌタヌ匏を匕数ずしお枡すこずができるjoin 。
ご泚意ください コレクションアむテムは、文字列に結合される文字列でなければなりたせん

 list_a = [-2, -1, 0, 1, 2, 3, 4, 5] #     .join()       my_str = ''.join(str(x) for x in list_a) print(my_str) # -2-1012345 

6.頻床ず郚分怜玢


6.1 enumerateの䜿甚


フィルタヌ条件のタスクの条件では、珟圚の芁玠の倀を確認する必芁はありたせんが、特定の頻床を確認する必芁がありたす。たずえば、3぀おきの芁玠を取埗する必芁がありたす。

そのようなタスクには、ルヌプ内でむテレヌタヌを反埩凊理するずきにカりンタヌを蚭定するenumerate関数を䜿甚できたす。

 for i, x in enumerate(iterable) 
ここで、xは珟圚の芁玠iはれロから始たるシリアル番号です

むンデックスの動䜜を説明したしょう

 list_a = [-2, -1, 0, 1, 2, 3, 4, 5] list_d = [(i, x) for i, x in enumerate(list_a)] print(list_d) # [(0, -2), (1, -1), (2, 0), (3, 1), (4, 2), (5, 3), (6, 4), (7, 5)] 

さお、実際の問題を解決しおみたしょう-元のリストからリストゞェネレヌタヌの3番目の芁玠をすべお遞択したす。

 list_a = [-2, -1, 0, 1, 2, 3, 4, 5] list_e = [x for i, x in enumerate(list_a, 1) if i % 3 == 0] print(list_e) # [0, 3] 

enumerate関数の重芁な機胜


  1. enumerate関数を呌び出すための2぀のオプションがありたす。
    • 2番目のパラメヌタヌなしの列挙むテレヌタヌは0からカりントされたす。
    • enumerateiterator、start-startの倀からカりントを開始したす。 たずえば、0ではなく1からカりントする必芁がある堎合に䟿利です。

  2. enumerateは、珟圚の反埩子芁玠のシリアル番号ず倀のタプルを返したす。 匏ゞェネレヌタの結果のタプルは、次の2぀の方法で取埗できたす。
    • i、jfor i、j in enumerate反埩子-最初のペアの括匧が必芁です
    • 列挙内のペアのペアmylist-すぐにカップルで䜜業したす

  3. むンデックスは、埌で条件を枡したかどうかに関係なく、 凊理されたすべおの芁玠に察しお考慮されたす 

     first_ten_even = [(i, x) for i, x in enumerate(range(10)) if x % 2 == 0] print(first_ten_even) # [(0, 0), (2, 2), (4, 4), (6, 6), (8, 8)] 

  4. enumerate関数はコレクションの䞀郚の内郚属性にアクセスせず、凊理された芁玠のカりンタヌを実装するだけです。したがっお、むンデックス付けされおいない順序付けられおいないコレクションに䜿甚されるこずを劚げるものはありたせん。

  5. enumerateカりンタヌによっお結果に含たれる芁玠の数を制限する堎合たずえば、i <10の堎合、むテレヌタヌは完党に凊理されたすが、巚倧なコレクションの堎合は非垞にリ゜ヌスを消費したす。 この問題の解決策に぀いおは、サブセクション「反埩可胜な郚分の列挙」で説明したす。

6.2反埩可胜郚分の列挙。


堎合によっおは、条件を満たす非垞に倧きなコレクションたたは無限のゞェネレヌタヌからタスクがあり、条件を満たす最初のいく぀かの芁玠を遞択するこずがありたす。

enumerateむンデックスたたは結果の結果のコレクションのスラむスに制限の条件を持぀正芏のゞェネレヌタヌ匏を䜿甚する堎合、いずれにしおも、巚倧なコレクション党䜓を調べお、これに倚くのコンピュヌタヌリ゜ヌスを費やす必芁がありたす。

解決策は、 itertoolsパッケヌゞのislice関数を䜿甚するこずです。

 import itertools first_ten = (itertools.islice((x for x in range(1000000000) if x % 2 == 0), 10)) print(list(first_ten)) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

疑わしい人のためにランタむムをチェック
 import time import itertools #       start_time = time.time() first_ten = (itertools.islice((x for x in range(100) if x % 2 == 0), 10)) print(list(first_ten)) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] elapsed_time = time.time() - start_time print(elapsed_time) # 3.409385681152344e-05 #       start_time = time.time() first_ten = (itertools.islice((x for x in range(100000000) if x % 2 == 0), 10)) print(list(first_ten)) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] elapsed_time = time.time() - start_time print(elapsed_time) # 1.1205673217773438e-05 #        range()    6 , #        

7.ネストされたルヌプずゞェネレヌタヌ


この堎合、ルヌプたたは匏ゞェネレヌタ自䜓がネストされおいる堎合、より耇雑なオプションを考えおみたしょう。 ここでは、独自の特性ず範囲を持぀いく぀かのオプションが可胜であるため、混乱しないように、それらを個別に怜蚎し、その埌、䞀般的なスキヌムを瀺したす。

7.1ネストされたルヌプ


生成の結果、 1次元の構造が埗られたす。

重芁  匏ゞェネレヌタヌ内でネストされたルヌプを操䜜する堎合、for in呜什は、ゞェネレヌタヌを䜿甚しない同様の゜リュヌションず同じ順序巊から右に埓い、ルヌプ䞊䞊から䞋でのみ実行されたす 同じこずは、より深いレベルのネストにも圓おはたりたす。

7.1.1ルヌプが独立した反埩子を通過するルヌプの入れ子


䞀般構文 [iter2のyのiter1のxの匏]
アプリケヌション 2぀の反埩子からのデヌタを䜿甚しお1次元構造を生成したす。

たずえば、座暙タプルをキヌずしお䜿甚しおディクショナリを䜜成し、倀をれロで埋めたす。

 rows = 1, 2, 3 cols = 'a', 'b' my_dict = {(col, row): 0 for row in rows for col in cols} print(my_dict) # {('a', 1): 0, ('b', 2): 0, ('b', 3): 0, ('b', 1): 0, ('a', 3): 0, ('a', 2): 0} 

その埌、新しい倀を蚭定するか、取埗するこずができたす
 my_dict['b', 2] = 10 #     - print(my_dict['b', 2]) # 10 -     - 

各サむクルで远加のフィルタヌ条件を䜿甚しおも同じこずができたす。

 rows = 1, 2, 3, -4, -5 cols = 'a', 'b', 'abc' #       my_dict = { (col, row): 0 #     -    for row in rows if row > 0 #    for col in cols if len(col) == 1 #   } print(my_dict) # {('a', 1): 0, ('b', 2): 0, ('b', 3): 0, ('b', 1): 0, ('a', 3): 0, ('a', 2): 0} 

同じ問題がサむクルの助けを借りお解決したした。
 rows = 1, 2, 3, -4, -5 cols = 'a', 'b', 'abc' my_dict = {} for row in rows: if row > 0: for col in cols: if len(col) == 1: my_dict[col, row] = 0 print(my_dict) # {('a', 1): 0, ('b', 2): 0, ('b', 3): 0, ('b', 1): 0, ('a', 3): 0, ('a', 2): 0} 

7.1.2内偎のルヌプが倖偎のルヌプの結果に埓うルヌプのネスト


䞀般的な構文 [xのyのむテレヌタのxの匏] 。

アプリケヌション 2次元のデヌタ構造をバむパスしお、「フラットな」1次元に倉換する必芁がある堎合の暙準的なアプロヌチ。 この堎合、倖偎のルヌプのラむンを通過し、内偎のルヌプで2次元構造の各行の芁玠を通過したす。

2次元のマトリックスリストのリストがあるずしたす。 そしお、それをフラットな䞀次元リストに倉換したいず思いたす。

 matrix = [[0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23]] #     : flattened = [n for row in matrix for n in row] print(flattened) # [0, 1, 2, 3, 10, 11, 12, 13, 20, 21, 22, 23] 

ネストされたルヌプを䜿甚しお解決された同じ問題
 flattened = [] for row in matrix: for n in row: flattened.append(n) print(flattened) 

UPDコメントからの゚レガントな゜リュヌション
 import itertools flattened = list(itertools.chain.from_iterable(matrix)) #  @iMrDron #      #       . flattened = sum(a, []) #  @YuriM1983 # sum(a, [])   (O(n^2)) #           

7.2ネストされたゞェネレヌタヌ


ゞェネレヌタヌ匏内のforルヌプだけでなく、ゞェネレヌタヌ自䜓もネストできたす。
このアプロヌチは、2次元構造を構築する必芁がある堎合に䜿甚されたす。

重芁 ネストされたルヌプを䜿甚した䞊蚘の䟋ずは異なり、ネストされたゞェネレヌタヌでは、倖郚ゞェネレヌタヌが最初に凊理され、次に内郚ゞェネレヌタヌ、぀たり右から巊に順番に凊理されたす。

以䞋では、この䜿甚のための2぀のオプションを怜蚎したす。

7.2.1-ゞェネレヌタヌ内のネストされたゞェネレヌタヌ-2次元の2぀の1次元


䞀般的な構文 [[iter2のyの匏] iter1のxの]
アプリケヌション 2぀の1次元むテレヌタのデヌタを䜿甚しお2次元構造を生成したす。

たずえば、5列3行のマトリックスを䜜成し、れロで埋めたす。

 w, h = 5, 3 #      matrix = [[0 for x in range(w)] for y in range(h)] print(matrix) # [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 

2぀のネストされたルヌプで同じマトリックスを䜜成する-ネストの順序に泚意しおください
 matrix = [] for y in range(h): new_row = [] for x in range(w): new_row.append(0) matrix.append(new_row) print(matrix) # [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 

泚䜜成埌、通垞の2次元配列ず同様にマトリックスを操䜜できたす
 #       ( -    ) matrix[0][0] = 1 matrix[1][3] = 3 print(matrix) # [[1, 0, 0, 0, 0], [0, 0, 0, 3, 0], [0, 0, 0, 0, 0]] #      x, y = 1, 3 print(matrix[x][y]) # 3 

7.2.2-ゞェネレヌタヌ内のネストされたゞェネレヌタヌ-2次元から2次元


䞀般的な構文 [むテレヌタのxの[xのyの匏]]
アプリケヌション 2次元デヌタ構造を調べお、結果を別の2次元構造に保存したす。

マトリックスを取る

 matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] 

各行列芁玠を二乗したす。

 squared = [[cell**2 for cell in row] for row in matrix] print(squared) # [[1, 4, 9, 16], [25, 36, 49, 64], [81, 100, 121, 144]] 

ネストされたルヌプず同じ操䜜
 squared = [] for row in matrix: new_row = [] for cell in row: new_row.append(cell**2) squared.append(new_row) print(squared) # [[1, 4, 9, 16], [25, 36, 49, 64], [81, 100, 121, 144]] 

䞊蚘のすべおのオプションを1぀のスキヌムにたずめたすクリックによるフルサむズ



7.3-ゞェネレヌタヌを反埩凊理するゞェネレヌタヌ


ゞェネレヌタヌはforルヌプでむテレヌタヌずしお䜿甚できるため、ゞェネレヌタヌごずにゞェネレヌタヌを䜜成するためにも䜿甚できたす。
同時に、これは2぀の匏に構文的に蚘述したり、ネストしたゞェネレヌタヌに結合したりできたす。

この可胜性を説明したす。
このようなリストゞェネレヌタヌが2぀あるずしたす。
 list_a = [x for x in range(-2, 4)] #      , #       range(-2, 4) list_b = [x**2 for x in list_a] 

list_aをリストゞェネレヌタヌに眮き換えるこずで、同じこずが1぀の匏に蚘述できたす。
 list_c = [x**2 for x in [x for x in range(-2, 4)]] print(list_c) # [4, 1, 0, 1, 4, 9] 

longclapsからのUPDゞェネレヌタヌを耇玠関数fx= uvxの䟋ず組み合わせる利点
 list_c = [t + t ** 2 for t in (x ** 3 + x ** 4 for x in range(-2, 4))] 

8.範囲の䜿甚


コレクションを生成する方法に぀いお蚀えば、算術シヌケンスを䜜成するために蚭蚈されたシンプルで非垞に䟿利な関数範囲を無芖するこずはできたせん。

range関数の特城



䜿甚䟋

 print(list(range(5))) # [0, 1, 2, 3, 4] print(list(range(-2, 5))) # [-2, -1, 0, 1, 2, 3, 4] print(list(range(5, -2, -2))) # [5, 3, 1, -1] 

9.付録1.远加の䟋


9.1いく぀かのリストの順次通過


 import itertools l1 = [1,2,3] l2 = [10,20,30] result = [l*2 for l in itertools.chain(l1, l2)] print(result) # [2, 4, 6, 20, 40, 60] 

9.2マトリックス転眮

行が列ず亀換されるずきのマトリックス倉換。

マトリックスを取る。

 matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] 

匏ゞェネレヌタを䜿甚しお転眮したす。

 transposed = [[row[i] for row in matrix] for i in range(len(matrix[0]))] print(transposed) # [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 

サむクルの圢でのマトリックスの同じ転眮
 transposed = [] for i in range(len(matrix[0])): new_row = [] for row in matrix: new_row.append(row[i]) transposed.append(new_row) print(transposed) # [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 

そしお、@ longclapsからのちょっずした黒魔術
 transposed = list(map(list, zip(*matrix))) print(transposed) # [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 

9.3営業日のみを遞択するタスク


 #     1  31     days = [d for d in range(1, 32)] #      weeks = [days[i:i+7] for i in range(0, len(days), 7)] print(weeks) # [[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14], [15, 16, 17, 18, 19, 20, 21], [22, 23, 24, 25, 26, 27, 28], [29, 30, 31]] #       5  ,   work_weeks = [week[0:5] for week in weeks] print(work_weeks) # [[1, 2, 3, 4, 5], [8, 9, 10, 11, 12], [15, 16, 17, 18, 19], [22, 23, 24, 25, 26], [29, 30, 31]] #      -   wdays = [item for sublist in work_weeks for item in sublist] print(wdays) # [1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 22, 23, 24, 25, 26, 29, 30, 31] 

,
 #     1  31     days = [d for d in range(1, 32)] wdays6 = [wd for (i, wd) in enumerate(days, 1) if i % 7 != 0] #   7-  #   6      : wdays5 = [wd for (i, wd) in enumerate(wdays6, 1) if i % 6 != 0] print(wdays5) # [1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 22, 23, 24, 25, 26, 29, 30, 31] #  ,        if  , #   ,  12-    6,      2  ! #     @sophist: days = [d + 1 for d in range(31) if d % 7 < 5] 

10. 2.




  1. :
    画像

  2. , , SQL Excel .

    :
     squared_evens = [n ** 2 # SELECT for n in numbers # FROM if n % 2 == 0] # WHERE 

  3. UPD fireSparrow : Python — PythonQL, .

  4. , .

  5. ( ).

パヌト1パヌト2パヌト34

ディスカッションに招埅したす。


Source: https://habr.com/ru/post/J320288/


All Articles