Python 3はリストをメタグループ指定列で並べ替える

11161 ワード

Pythonバージョン:python 3.+運転環境:Mac OS IDE:pycharm
  • Python内蔵のソート方法
  • 並べ替え方法紹介
  • 基本的なリストソート
  • tupleをlistとする要素
  • dictをlistとする要素
  • を拡張

    Python内蔵のソート方法
    1ソート方法の説明
    Pythonにはリストに組み込まれたsort()メソッドとグローバルなsorted()メソッドの2つのソート関数があります
    sorted(iterable,key=None,reverse=False) #         ,       ,    ;reverse:-True   -False                
    list.sort(key=None,reverse=False) # list      ,     list  ,    ;reverse:-True   -False   

    2基本的なリストのソート
    1)list.sort()ソート
    data = [5, 7, 9, 3, -6, -7, -8, -9, 3, -8]
    result = data.sort()
    print(data) #    [-9, -8, -8, -7, -6, 3, 3, 5, 7, 9]
    print(result) #   None

    2)sorted()ソート
        data = [5, 7, 9, 3, -6, -7, -8, -9, 3, -8]
        result = sorted(data)
        print(data) #    [5, 7, 9, 3, -6, -7, -8, -9, 3, -8]
        print(result) #    [-9, -8, -8, -7, -6, 3, 3, 5, 7, 9]

    3 tupleをlistの要素とする
    デフォルトでsort関数とsorted関数が受信するパラメータがメタグループの場合、メタグループの最初の要素でソートしてから2番目の要素でソートし、3番目、4番目...でソートします.簡単な例で説明します.以下のリストを例に挙げます.
    data = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]

    sorted()で並べ替えました
    data = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
    result = sorted(data)
    print(data) #    [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
    print(result) #    [(0, 'B'), (0, 'a'), (1, 'A'), (1, 'B'), (2, 'A')]

    並べ替えた結果(0,‘B’)が(0,‘a’)の前にあることがわかります.これは,メタグループの1番目の要素で並べ替えた後,(0,‘B’),(0,‘a’)を2番目の要素で並べ替えたのに対し,’B’のASCII符号化は’a’よりも小さいので,(0,‘B’)は(0,‘a’)の前に並べ替えられたからである.
    では、どのようにしてソートするときに大文字と小文字を区別しないようにしますか?
    これはsortメソッドとsortedメソッドのkeyパラメータを使用します.具体的な実装を見てみましょう.
    data = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
    #    key        
    result = sorted(data,key=lambda x:(x[0],x[1].lower()))
    
    print(data) #    [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
    print(result) #    [(0, 'a'), (0, 'B'), (1, 'A'), (1, 'B'), (2, 'A')]

    そのうちのlambda x:(x[0],x[1].lower()は匿名関数として理解できる.次のような機能があります.
    def fun(x)
        return(x[0],x[1].lower())

    アルファベットを最初のソートルールとし、アルファベットの大文字と小文字が敏感でない場合は、どのように実現しますか?これは前に述べたように
    デフォルトでsort関数とsorted関数が受信するパラメータがメタグループの場合、メタグループの最初の要素でソートしてから2番目の要素でソートし、3番目、4番目...でソートします.
    Lambdaと協力してカスタムtupleを返します.コードは次のとおりです.
    data = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
    # x[1].lower()             ,  sorted     ,        ,       
    result = sorted(data,key=lambda x:(x[1].lower(),x[0]))
    
    print(data) #    [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')] 
    print(result) #    [(0, 'a'), (1, 'A'), (2, 'A'), (0, 'B'), (1, 'B')]

    4[拡張]dictをlistの要素とする
    このlistの要素はdict形式で、各dictには が保存されています.現在、昇順で並べ替えたいと思っています.
    data = [{'name': '  ', 'height': 175}, {'name': '  ', 'height': 165}, {'name': '  ', 'height': 185}]
    # x['height']    tuple      
    result = sorted(data,key=lambda x:(x['height'],x['name']))
    print(data) #    
    print(result)
    #data     :[{'name': '  ', 'height': 175}, {'name': '  ', 'height': 165}, {'name': '  ', 'height': 185}]
    #result   :[{'name': '  ', 'height': 165}, {'name': '  ', 'height': 175}, {'name': '  ', 'height': 185}]