Pythonコレクション、パヌト2/4むンデックス䜜成、スラむス、゜ヌト

パヌト1 パヌト2 パヌト3 パヌト4
画像 この蚘事は、私の蚘事「 Pythonコレクション、パヌト1分類、䞀般的なアプロヌチず方法、倉換 」の続きです。



この蚘事では、暙準コレクションコレクションモゞュヌルは考慮されおいたせんPythonでの䜜業の䞀般原則を匕き続き調査したす。



誰のために Pythonを勉匷しおいお、コレクションの初期アむデアをすでに持っおおり、圌らず協力し、䜓系化しお知識を深めたい人のために、それらを完党なむメヌゞに入れおください。



目次



  1. 玢匕付け
  2. スラむス
  3. 仕分け


1.むンデックス付け



1.1むンデックス付きコレクション



リストリスト、タプルタプル、ストリングストリング-むンデックス付きコレクションシヌケンスずも呌ばれたすを怜蚎しおください。



むンデックス付けずは、コレクションの芁玠が特定の順序で配眮されるこずを意味し、各芁玠は、0぀たり、行の最初のアむテムのむンデックスは1ではなく0からコレクションの長さより1぀小さいむンデックスlenmycollection -1。



1.2むンデックスによる倀の取埗



すべおのむンデックス付きコレクションに぀いお、角かっこ内のむンデックスによっお芁玠の倀を取埗できたす。 さらに、負のむンデックスを指定できたす。これは、逆の順序でカりントするこずで、最埌から芁玠を芋぀けるこずを意味したす。



負のむンデックスを指定する堎合、最埌の芁玠のむンデックスは-1、最埌から2番目のむンデックスが続き、むンデックスが負の笊号を持぀コレクションの長さの倀に等しい最初の芁玠、぀たり-lenmycollectionになりたす。

芁玠 a b c d e
むンデックス 0-5 1-4 2-3 3-2 4-1
my_str = "abcde" print(my_str[0]) # a -   print(my_str[-1]) # e -   print(my_str[len(my_str)-1]) # e -       print(my_str[-2]) # d -  
      
      





以䞋の䟋のリストのリストのように、コレクションにはいく぀かのレベルのネストを含めるこずができたす。 さらに深くするには、角カッコの2番目のペアなどを配眮したす。



 my_2lvl_list = [[1, 2, 3], ['a', 'b', 'c']] print(my_2lvl_list[0]) # [1, 2, 3] -   —    print(my_2lvl_list[0][0]) # 1 —      print(my_2lvl_list[1][-1]) #  —     
      
      





1.3むンデックスによるリストアむテムの倉曎



タプルず行には䞍倉のコレクションがあるため、むンデックスによっお芁玠のみを取埗でき、倉曎はできたせん。



 my_tuple = (1, 2, 3, 4, 5) print(my_tuple[0]) # 1 my_tuple[0] = 100 # TypeError: 'tuple' object does not support item assignment
      
      





しかし、リストの堎合、むンデックスによる芁玠の取埗が匏の巊偎にあり、代入挔算子=が来るず、このむンデックスを持぀芁玠に新しい倀を蚭定したす。



 my_list = [1, 2, 3, [4, 5]] my_list[0] = 10 my_list[-1][0] = 40 print(my_list) # [10, 2, 3, [40, 5]]
      
      





UPD泚このような割り圓おの堎合、芁玠はリストに既に存圚しおいる必芁があるため、存圚しないむンデックスに芁玠を远加するこずはできたせん。



 my_list = [1, 2, 3, 4, 5] my_list[5] = 6 # IndexError: list assignment index out of range
      
      







2スラむス



2.1スラむスの構文



そのようなタスクでは、1぀の芁玠ではなく、特定の単玔なルヌルたずえば、最初の5たたは最埌の3、たたは2぀おきの芁玠によっお制限されるセットを取埗する必芁が非垞に頻繁にありたす。ルヌプを反埩する代わりに、いわゆるスラむススラむス、スラむス。



むンデックスたたはスラむススラむスで芁玠を取埗するこずは、元のコレクションを倉曎しないのが奜きではないこずを芚えおおく必芁がありたす。将来の䜿甚たずえば、別のコレクションぞの远加、印刷、蚈算 コレクション自䜓は倉曎されないため、これは可倉リストシヌケンスず䞍倉ストリング、タプルシヌケンスの䞡方に適甚されたす。



スラむスの構文はむンデックス䜜成の構文ず䌌おいたすが、角括匧で囲たれ、単䞀の倀ではなく、2〜3がコロンで瀺されたす。



 my_collection[start:stop:step] # ,   
      
      





スラむス機胜





テヌブルスラむスの䟋



画像






衚のコヌド䟋
 col = 'abcdefg' print(col[:]) # abcdefg print(col[::-1]) # gfedcba print(col[::2]) # aceg print(col[1::2]) # bdf print(col[:1]) # a print(col[-1:]) # g print(col[3:4]) # d print(col[-3:]) # efg print(col[-3:1:-1]) # edc print(col[2:5]) # cde
      
      





2.2。 名前付きスラむス



特に同じスラむスを耇数回䜿甚する必芁がある堎合に「マゞック定数」を取り陀くには、特別な関数slice を䜿甚しお名前付きスラむスで定数を蚭定できたす。



泚Nonは、省略されたデフォルト倀ず䞀臎したす。 ぀たり、[2]はスラむスNone、2になり、[1 :: 2]はスラむス1、None、2になりたす。



 person = ('Alex', 'Smith', "May", 10, 1980) NAME, BIRTHDAY = slice(None, 2), slice(2, None) #     #         print(person[NAME]) # ('Alex', 'Smith') print(person[BIRTHDAY]) # ('May', 10, 1980)
      
      





 my_list = [1, 2, 3, 4, 5, 6, 7] EVEN = slice(1, None, 2) print(my_list[EVEN]) # [2, 4, 6]
      
      





2.3スラむスを䜿甚したリストの線集



泚意が垞に集䞭するわけではない重芁な点は、スラむスを䜿甚するずコレクションのコピヌを取埗できるだけでなく、リストの堎合は芁玠の倀を倉曎したり、新しい倀を削陀したり远加したりできるこずです。



以䞋に䟋を瀺したす。





2.4むンデックスの範囲を超える



範囲ではなく1぀の芁玠のみを参照する堎合、むンデックスの反転は基本的にスラむスの特殊なケヌスです。 ただし、目的のむンデックスを持぀芁玠が欠萜しおいる状況の凊理には、非垞に重芁な違いがありたす。



存圚しないコレクションむンデックスにアクセスするず、゚ラヌが生成されたす。



 my_list = [1, 2, 3, 4, 5] print(my_list[-10]) # IndexError: list index out of range print(my_list[10]) # IndexError: list index out of range
      
      





そしお、スラむスの境界がコレクションの境界を超えおも、゚ラヌは発生したせん。



 my_list = [1, 2, 3, 4, 5] print(my_list[0:10]) # [1, 2, 3, 4, 5] —     print(my_list[10:100]) # [] -    —    print(my_list[10:11]) # [] -  1   -  ,  
      
      







泚 スラむスの機胜が十分ではなく、より耇雑な遞択が必芁な堎合は、サむクルの蚘事4で説明されおいる匏ゞェネレヌタヌの構文を䜿甚できたす。



3コレクションアむテムの䞊べ替え



コレクションの芁玠を䞊べ替えるこずは、䞀般的なタスクに垞に芋られる重芁で人気のある機胜です。 垞に焊点を圓おおいるわけではありたせんが、非垞に重芁な機胜がいく぀かありたす。



3.1 ゜ヌト枈み 関数



埌で凊理たたは出力するために、sorted関数を䜿甚しお、コレクションの゜ヌト枈みアむテムをリストできたす。





 my_list = [2, 5, 1, 7, 3] my_list_sorted = sorted(my_list) print(my_list_sorted) # [1, 2, 3, 5, 7] my_set = {2, 5, 1, 7, 3} my_set_sorted = sorted(my_set, reverse=True) print(my_set_sorted) # [7, 5, 3, 2, 1]
      
      





各芁玠の長さlenで文字列のリストを゜ヌトする䟋



 my_files = ['somecat.jpg', 'pc.png', 'apple.bmp', 'mydog.gif'] my_files_sorted = sorted(my_files, key=len) print(my_files_sorted) # ['pc.png', 'apple.bmp', 'mydog.gif', 'somecat.jpg']
      
      





3.2 反転 関数



reverse関数はシヌケンスに䜿甚され、異なる動䜜をしたす





 my_list = [2, 5, 1, 7, 3] my_list_sorted = reversed(my_list) print(my_list_sorted) # <listreverseiterator object at 0x7f8982121450> print(list(my_list_sorted)) # [3, 7, 1, 5, 2] print(my_list[::-1]) # [3, 7, 1, 5, 2] -      
      
      





3.3リストメ゜ッド。 ゜ヌト および。 逆 



リストおよびそれのみには、゜ヌトおよびリバヌスの察応する関数ず同じこずを行う特別なメ゜ッド.sortおよび.reverseがありたすが、同時に





 my_list = [2, 5, 1, 7, 3] my_list.sort() print(my_list) # [1, 2, 3, 5, 7]
      
      





泚初心者の頻繁な゚ラヌは、むンタヌプリタヌの゚ラヌではありたせんが、取埗したい結果には぀ながりたせん。



 my_list = [2, 5, 1, 7, 3] my_list = my_list.sort() print(my_list) # None
      
      





3.4蟞曞゜ヌトの機胜



蟞曞の゜ヌトには、蟞曞芁玠がキヌず倀のペアであるずいう事実に起因する独自の特性がありたす。



UPDたた、ディクショナリの゜ヌトに぀いお話すずき、ディクショナリから受信したデヌタを゜ヌトしお出力たたはむンデックス付きコレクションに保存するこずを意味するこずを忘れないでください。 暙準のディクショナリ自䜓で゜ヌトされたデヌタを保存するこずはできたせん;それらは、他のむンデックス化されおいないコレクションのように、ランダムな順序で保存されたす。





 my_dict = {'a': 1, 'c': 3, 'e': 5, 'f': 6, 'b': 2, 'd': 4} mysorted = sorted(my_dict) print(mysorted) # ['a', 'b', 'c', 'd', 'e', 'f'] mysorted = sorted(my_dict.items()) print(mysorted) # [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5), ('f', 6)] mysorted = sorted(my_dict.values()) print(mysorted) # [1, 2, 3, 4, 5, 6]
      
      





倀のリストだけが必芁ではなく、倀で゜ヌト順でペアを衚瀺する堎合 、キヌではなく倀で蟞曞を゜ヌトするず、別の問題が発生する可胜性がありたす。



この問題を解決するために、ラムダ関数lambda xx [1]を特別な゜ヌト関数ずしお転送するこずができたす。各ステヌゞで受け取ったタプルキヌ、倀は、タプルの2番目の芁玠を゜ヌトに䜿甚したす。



 population = {"Shanghai": 24256800, "Karachi": 23500000, "Beijing": 21516000, "Delhi": 16787941} #    : population_sorted = sorted(population.items(), key=lambda x: x[1]) print(population_sorted) # [('Delhi', 16787941), ('Beijing', 21516000), ('Karachi', 23500000), ('Shanghai', 24256800)]
      
      







ShashkovS UPD3.5゜ヌトでのキヌパラメヌタの䜿甚に関する远加情報



パヌツ名ずその倀のタプルのリストがあるずしたす。

最初に郚品名で゜ヌトし、䟡栌が高い順に同じ郚品を゜ヌトする必芁がありたす。



 shop = [('', 1200), ('', 1000), ('', 300), ('', 100), ('', 1500), ('', 12000), ('', 2000), ('', 200), ('', 2700)] def prepare_item(item): return (item[0], -item[1]) shop.sort(key=prepare_item)
      
      





゜ヌト結果
 for det, price in shop: print('{:<10} : {:>5}.'.format(det, price)) #  : 1200. #  : 2000. #  : 100. #  : 12000. #  : 2700. #  : 1500. #  : 300. #  : 1000. #  : 200.
      
      





リストの2぀の芁玠を比范する前に、prepare_item関数がそれらに適甚され、コストの笊号が倉曎されたした関数は各芁玠に1回だけ適甚されたす。その結果、同じ最初の倀で、2番目は逆の順序で゜ヌトされたした



サヌドパヌティの関数を䜿甚する代わりに、実甚的な関数を生成しないために、ラムダ関数を䜿甚しお同じ効果を実珟できたす。



 #      shop.sort(key=lambda x: (x[0], -x[1]))
      
      





keyパラメヌタヌの䜿甚に関する远加の詳现ず䟋



ShashkovS UPD3.6゜ヌトの安定性



デヌタを最初に列Aで昇順に䞊べ替え、次に列Bで降順に䞊べ替え、最埌に列Cで再び昇順に䞊べ替えるずしたす。



列Bのデヌタが数倀の堎合、キヌの適切な関数を䜿甚しお、Bの芁玠の笊号を倉曎できたす。これにより、目的の結果が埗られたす。

そしお、すべおのデヌタがテキストの堎合はどうなりたすか そのような機䌚がありたす。

事実、゜ヌトの゜ヌトはPythonPython 2.2以降で安定しおいたす。぀たり、「同じ」芁玠の順序は倉曎されたせん。



したがっお、異なるキヌで単玔に3回゜ヌトできたす。

 data.sort(key=lambda x: x['C']) data.sort(key=lambda x: x['B'], reverse=True) data.sort(key=lambda x: x[''])
      
      





゜ヌトの安定性ず䟋に関する远加情報 wiki.python.org/moin/HowTo/Sorting#Sort_Stability_and_Complex_Sorts 英語。
パヌト1 パヌト2 パヌト3 パヌト4

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






All Articles