Python内蔵関数-min関数とmax関数-詳細

7702 ワード

ブログの主な内容は以下の通りです.
maxとmin関数の使用説明:
  • 反復可能オブジェクト要素を比較すると、最大/最小値max(iterable,*[,default=obj,key=func])
  • が見つかる.
  • 入力された複数のパラメータを比較し、最大/最小値max(arg 1,arg 2,*args,*[,key=func])
  • を見つけた.
  • では、複雑な構造のデータの下で、関数定義のkeyをどのように使用するかについて説明します.

  • 需要:リストに最も多く表示される要素を見つけます.3つの実装方式:(1)max関数のkeyパラメータを柔軟に使用する;(2)辞書統計要素カウントを用いて、手動で関数にカプセル化する.(3)説明を広げた.Counterクラス、Counterオブジェクトのmost_を使用commonメソッド.
    拡張内容:heapqモジュールのnlargest関数部分のソースコード、collections.Counterクラスの紹介とmost_commonメソッドソースコード.
    maxとmin関数の機能をどのように探求しますか?私たちがまずしなければならないのは関数の公式APIを読むことです!IDEを使用して関数を表示するか、インタラクティブな環境でコマンド:help(max)を入力すると、公式の関数コメントが表示されます.
    def max(*args, key=None): # known special case of max
        """
        max(iterable, *[, default=obj, key=func]) -> value
        max(arg1, arg2, *args, *[, key=func]) -> value
        
        With a single iterable argument, return its biggest item. The
        default keyword-only argument specifies an object to return if
        the provided iterable is empty.
        With two or more arguments, return the largest argument.
        """
        pass
    
    def min(*args, key=None): # known special case of min
        """
        min(iterable, *[, default=obj, key=func]) -> value
        min(arg1, arg2, *args, *[, key=func]) -> value
        
        With a single iterable argument, return its smallest item. The
        default keyword-only argument specifies an object to return if
        the provided iterable is empty.
        With two or more arguments, return the smallest argument.
        """
        pass

    このような内容を示し,一般にこの2つの関数を表す下位実装はC言語プログラムである.具体的な実装方法については、ソースコードのさらなる探索も必要である.このブログでは、まずAPIの内容を把握します.関数の説明から見てください.maxとmin関数の使用方法は同じで、違いはmax関数が最大値を探し、min関数が最小値を探すことだけです.以下ではmax関数のみを例としてmax関数とmin関数の使用について説明する.
    minとmaxを使用すると、比較可能な要素間で比較可能でなければなりません.そうしないと、エラーが表示されます.要素間の比較については、前の文章で議論を展開しました.この博文の最後の部分は要素間の比較に関する議論です.ブログアドレス:データ型-コンテナ類データ型
    一、関数の2つの使用方法:1,max(iterable,*[,default=obj,key=func])->value iterable:比較する要素はすべて反復可能なオブジェクトの中にあり、最初の位置パラメータはこの反復可能なオブジェクトに伝わり、関数は反復可能なオブジェクトの中で最も大きな要素を返します.辞書が入力場合、比較は辞書のキー、すなわちdtが入力されたことに相当する.keys().
    #           0-9       ,    max min  
    >>> from random import shuffle
    >>> data = list(range(10))
    >>> shuffle(data)
    
    >>> max(data)
    9
    >>> min(data)
    0

    キーワードパラメータdefault:反復可能なオブジェクトに要素がない場合、defaultキーワードパラメータを指定すると、defaultパラメータの値が返されます.この場合defaultパラメータが指定されていない場合、プログラムはエラーを報告します:ValueError:max()arg is an empty sequence;
    >>> max(range(10))
    9
    >>> max(range(0))
    Traceback (most recent call last):
      File "", line 1, in 
    ValueError: max() arg is an empty sequence

    次のコードは、heapqモジュールのnlargest関数のソースコードを読むときに遭遇したdefaultキーワードパラメータの使用です.
    def nlargest(n, iterable, key=None):
        """         n   
               :  sorted(iterable, key=key, reverse=True)[:n]
        """
        # Short-cut for n==1 is to use max()
        if n == 1:
            it = iter(iterable)
            sentinel = object()
            if key is None:
                result = max(it, default=sentinel)
            else:
                result = max(it, default=sentinel, key=key)
            return [] if result is sentinel else [result]
        pass
    #   :sentinel     ,               。
    #        max   default             ,                   []

    2,max(arg 1,arg 2,*args,*[,key=func])->valueは複数のパラメータを入力し,複数のパラメータ間を比較し,最大のパラメータを見つけた.
    >>> max(9, 1, 2, 3)
    9

    二、関数のデフォルトパラメータkeyの使用:keyは呼び出し可能なオブジェクトを入力しなければならない.一般的には関数を入力する.keyを指定すると、max関数はkey処理後の要素に基づいて比較されます.
    需要1:例えば以下の場合、各果物の価格情報はすべて辞書の形式で保存するリストの中で、最も高い果物と最も安い果物を探し当てます
    fruit_shop = [
        {'name': 'apple',  'price': 5.68},
        {'name': 'orange', 'price': 4.22},
        {'name': 'banana', 'price': 2.65},
        {'name': 'berries', 'price': 10.75}]
    
    cheap = min(fruit_shop, key=lambda s: s['price'])
    expensive = max(fruit_shop, key=lambda s: s['price'])
    print('       :', cheap)
    print('      :', expensive)
    
    ####
    #        : {'name': 'banana', 'price': 2.65}
    #       : {'name': 'berries', 'price': 10.75}

    需要2:リストに最も多く表示される要素を見つけます.
    >>> lt = [2, 2, 3, 1, 2, 2, 1, 8, 5]
    >>> max(set(lt), key=lt.count)
    2

    注意:countメソッドをパラメータとしてmax関数に渡すと、ここでmax関数は要素の出現頻度を比較します.
    1.set(lt)はltリスト内のすべての一意の値を得ることができ、簡単に言えばリスト要素を重み付けし、1つの集合(すなわちsetタイプ)を得ることができる.
    >>> set(lt)
    
    {1, 2, 3, 5, 8}

    2.リストのcountメソッドは、統計リスト要素の出現回数を見つけることです.
    >>> lt.count(2)
    4
    >>> lt.count(1)
    2

     
    max関数を使用しないで、私たちはどのように実現しますか?
    1つ目は、カスタム関数、辞書を使用して要素カウントを手動で統計する方法です.
    #辞書dt、統計要素(key)、および要素の出現回数(value)#出現回数が最も大きい要素はmax_count_keyは、リスト要素を巡回し、辞書で要素の出現回数を統計した場合、統計を繰り返さない.リストのcountメソッドを使用して要素の出現回数を統計し、max_count_key比較
    def max_count(lt):
        dt = {}
        max_count_key = None
        for i in lt:
            #                 
            if i not in dt:
                count = lt.count(i)
                dt[i] = count
                if count > dt.get(max_count_key, 0):
                    max_count_key= i
        return max_count_key

    第2の方法(推奨):collectionsを使用する.Counterクラス、そのmost_common()メソッドは、シーケンスに最も多く出現する回数を検索することです.
    collections.Counterクラスは、反復可能なオブジェクトの要素をカウントし、Counterオブジェクトにキー値ペアで保存するCounterオブジェクトがマッピングに属し、dict()でCounterオブジェクトを辞書に変換することができます.
    >>> from collections import Counter
    >>> c = Counter('MyNameisMarsenHelloWorld')
    >>> c
    Counter({'e': 3, 'l': 3, 'M': 2, 'a': 2, 's': 2, 'r': 2, 'o': 2, 'y': 1, 'N': 1, 'm': 1, 'i': 1, 'n': 1, 'H': 1, 'W': 1, 'd': 1})
    >>> dict(c)
    {'M': 2, 'y': 1, 'N': 1, 'a': 2, 'm': 1, 'e': 3, 'i': 1, 's': 2, 'r': 2, 'n': 1, 'H': 1, 'l': 3, 'o': 2, 'W': 1, 'd': 1}

    Counterクラスのmost_common(n=None)メソッド:n個の最も一般的な要素とそのカウントをリストし、最も一般的なものから最も少なく見られるものまでリストします.nがNoneの場合、すべての要素の数がリストされます.最もよく見られるものから最も少なく見られるものまでです.関数の戻り値は、結果要素のリストです.
    >>> c.most_common()
    [('e', 3), ('l', 3), ('M', 2), ('a', 2), ('s', 2), ('r', 2), ('o', 2), ('y', 1), ('N', 1), ('m', 1), ('i', 1), ('n', 1), ('H', 1), ('W', 1), ('d', 1)]
    >>> c.most_common(3)
    [('e', 3), ('l', 3), ('M', 2)]

    most_commonメソッドのソースコード読み取り:#n=Noneの場合、メソッドの実装は、要素カウントの統計結果を、関数:sorted(iterable[,key=None[,reverse=False])を内蔵することによって逆順序にソートします.#メソッドの呼び出しがnの値を指定すると、メソッドの実装はheapqモジュールのnlargest(n,iterable[,key=None])関数によって実現され、この関数の役割は反復可能なオブジェクトから最大のn要素を見つけることである.この関数を直接利用すると,要素のカウントで比較するだけで最も一般的なn要素が得られる.
    def most_common(self, n=None):
        if n is None:
            return sorted(self.items(), key=_itemgetter(1), reverse=True)
        return _heapq.nlargest(n, self.items(), key=_itemgetter(1))

    Counterクラスを知ると、データ技術の場合に非常に便利なツールです.Counterクラスを優先的に使用して機能を実現することができます.これは、辞書のカウントを手動で使用するよりも便利です.
    この需要2:最大出現回数または最小出現回数の要素を探す場合はmaxまたはmin関数を直接使用して解決すればよい
    最も一般的なn要素を探したい場合は、Counterクラスを優先して関連機能を実現します.
    >>> lt = [2, 2, 3, 1, 2, 2, 1, 8, 5]
    >>> Counter(lt).most_common(1)
    [(2, 4)]
    >>> Counter(lt).most_common(1)[0][0]
    2