【pythonラーニング】辞書、集合、シーケンス

45605 ワード

一、辞書
辞書はC++のSTLテンプレートのmapに似たマッピングと理解できる.
例えば、整形配列は、数値から数値へのマッピングを確立し、文字列配列は、数値から文字列へのマッピングを確立する.辞書はより広範なマッピングを確立することができます.たとえば、文字列から数値へのマッピング、元祖から文字列へのマッピングを確立できます.
マッピングには、キー(key)と値(value)のペアがあり、キーはインデックスに使用され、値は格納されたオブジェクトです.たとえば、文字列配列のキーは数値であり、値は文字列です.この一対のキー値は、辞書の基本要素を二元グループ(key,value)として構成する.pythonでは、キーは数字、文字列、元祖などの可変タイプのみで、リストのような可変タイプは取れません.値は任意のタイプをとることができます.
辞書はカッコ{}で表され、キー値の間にはコロン:区切りがあります.次のようになります.
>>> dic = {
     "name":"Tom", 'age':12,'love':'girl'}
>>> type(dic)
<class 'dict'>

練習問題
1、辞書の基本操作辞書の内容は以下の通りである.
dic= {
      
'python': 95,
'java': 99,
'c': 100
}

プログラムで次の質問に答えます.
  • 辞書の長さはいくらですか
  • java’というkeyに対応するvalue値を98
  • に変更してください.
  • cこのkey
  • を削除
  • key-valueペアを追加し、key値はphp、valueは90
  • です.
  • はすべてのkey値を取得し、リストに
  • を格納する.
  • すべてのvalue値を取得し、リストに
  • を格納する
  • javascriptが辞書の
  • にあるかどうかを判断する
  • 辞書のvalueのすべてと
  • を取得
  • 辞書で最大のvalue
  • を取得
  • 辞書の最小value
  • を取得
  • 辞書dic 1={‘php’:97}、dic 1のデータをdicに更新する
  • 分析:主にリストの基本操作を考察し、コードは以下の通りである.
    
    >>> dic
    {
         'python': 95, 'java': 99, 'c': 100}	#    
    
    >>> len(dic)	#       
    3
    
    >>> dic['java'] = 98	#  'java'  key   value  98
    >>> dic
    {
         'python': 95, 'java': 98, 'c': 100}
    
    >>> del dic['c']	#  c  key
    >>> dic
    {
         'python': 95, 'java': 98}
    
    >>> dic['php'] = 90	#    key-value 、 key  php,value 90
    >>> dic
    {
         'python': 95, 'java': 98, 'php': 90}	
    
    >>> lst = list(dic.keys())	#     key ,      
    >>> lst
    ['python', 'java', 'php']
    
    >>> lst = list(dic.values())	#     value ,      
    >>> lst
    [95, 98, 90]
    
    >>> 'javascript' in dic	#  javascript      
    False
    
    >>> sum(dic.values())	#       value  
    283
    
    >>> max(dic.values())	#        value
    98
    
    >>> min(dic.values())	#        value
    90
    
    >>> dic1 = {
         'php': 97}	# dic1      dic 
    >>> dic.update(dic1)
    >>> dic
    {
         'python': 95, 'java': 98, 'php': 97}
    

    2、辞書のvalue
    学生の各プログラミング言語の成績、内容を以下のように保存する辞書があります.
    data = {
           'python':{
          '   ': '90', '   ': '95'},
            'c++': ['95', '96', '97'],
            'java': [{
          '  ':'90', '    ': '94', '    ': '98'}]
            }
    

    各科目の試験成績の格納方法は異なります.辞書を使う人もいれば、リストを使う人もいますが、点数は文字列タイプです.関数transferを実現してください.score(score_dict)、スコアをintタイプに変更
    構想:再帰思想を用いて,伝達関数データ型の違いに基づいて分類して議論する.
  • 再帰境界が入力データのタイプが文字列である場合、文字列をintタイプに変更して値を返します.
  • 文字列は数字ではない可能性があるので、プログラムの異常終了を防ぐために異常処理で特判する必要があります.
  • 受信データのタイプが辞書またはリストである場合、その各要素を巡回し、この関数を再帰的に呼び出す.戻り値を各要素に割り当てます.
  • def transfer_score(data):
        if type(data) == str: #    
            try:
                data = int(data)
            except ValueError: #            
                pass
        elif type(data) == dict:
            for i in data: #       
                data[i] = transfer_score(data[i]) #            ,                
        elif type(data) == list:
            for i in range(len(data)): #       
                data[i] = transfer_score(data[i])
        return data #     data  
    
    data = {
          'python':{
         '   ': '90', '   ': '95'},
            'c++': ['95', '96', '97'],
            'java': [{
         '  ':'90', '    ': '94', '    ': '98'}]
            }
    
    print(data)
    transfer_score(data)
    print('
    '
    + '*' * 30 + ' ' + '*' * 30 + '
    '
    ) print(data)

    実行結果は次のとおりです.
    output:
    {
         'python': {
         '   ': '90', '   ': '95'}, 'c++': ['95', '96', '97'], 'java': [{
         '  ': '90', '    ': '94', '    ': '98'}]}
    
    ******************************   ******************************
    
    {
         'python': {
         '   ': 90, '   ': 95}, 'c++': [95, 96, 97], 'java': [{
         '  ': 90, '    ': 94, '    ': 98}]}
    

    二、集合
    コレクションは、インデックスがなく、各要素が重複しないことを特徴とするデータを格納するコンテナです.これは数学の概念と似ており,ここでは後述しない.
    集合もカッコ{}で表されますが、キー値の概念はありません.次のようになります.
    >>> s = {
         1, 2, 2, 3, 5}
    >>> s
    {
         1, 2, 3, 5}	#          ,           
    >>> type(s)
    <class 'set'>
    

    練習問題
    1.数値1のみを含むタプルをどのように表示しますか.
    考え方:元祖をカッコで表す
    >>> tu = (1,)
    >>> tu
    (1,)
    >>> type(tu)
    <class 'tuple'>
    

    2.空の集合を作成し、{‘x’,‘y’,z’}の3つの要素を追加します.
    >>> s = set()
    >>> s.add('x')
    >>> s.add('y')
    >>> s.add('z')
    >>> s
    {
         'x', 'z', 'y'}
    >>> type(s)
    <class 'set'>
    

    3.リスト[‘A’,‘B’,‘A’,‘B’]を削除します.
    考え方:setを利用して重さを取り除く
    >>> lst = list(set(['A', 'B', 'A', 'B']))
    >>> lst
    ['B', 'A']
    

    4.2つの集合{6,7,8},{7,8,9}の中で重複しない要素を求める(差集合は2つの集合の交差外の部分を指す).
    構想:これは2つの集合の異論または結果を求める.集合AとBに対して,A^B=(A−B)〜(B−A)
    >>> s1 = {
         6, 7, 8}
    >>> s2 = {
         7, 8, 9}
    >>> s = s1 ^ s2
    >>> s
    {
         9, 6}
    

    5.「A」、「B」、「C」の要素が「B」、「C」、「D」に現れる回数を求める.
    res = 0
    s1 = {
         'A', 'B', 'C'}
    s2 = {
         'B', 'C', 'D'}
    for i in s1:
        if i in s2:
            res += 1
    print(res)
    

    output: 2
    三、シーケンス
    文字列、リスト、元祖は、整数インデックスを使用できるため、シーケンスとして計算できます.
    練習問題
    1.どのようにしてシーケンスの最大、小値を見つけますか?
    max()、min()関数を使用して、次のように使用します.
    コード1(デジタルシーケンス)
    >>> lst = [2, 3, 4, 5, 1, -6]
    >>> min(lst)
    -6
    >>> max(lst)
    5
    >>> type(min(lst))	#     int()
    <class 'int'>
    
    >>> lst.append(-9.63)	#         
    >>> lst
    [2, 3, 4, 5, 1, -6, -9.63]
    >>> type(min(lst))	#              , int float    
    <class 'float'>
    >>> type(max(lst))
    <class 'int'>
    

    コード2(文字列型シーケンス)
    >>> lst = ['fef', '55', 'haha']
    >>> lst
    ['fef', '55', 'haha']
    >>> min(lst)
    '55'
    >>> max(lst)
    'haha'
    >>> type(min(lst))
    <class 'str'>
    

    コード3(単一文字列、文字シーケンスとして理解可能)
    <class 'str'>
    
    >>> max('abcdABCD')
    'd'
    >>> type(max('abcdABCD'))
    <class 'str'>
    

    2.sort()とsorted()の違い
    シーケンスlstにとってlst.sort()は、元のシーケンスlstを直接シーケンスし、戻り値がない操作です.一方sortedは関数であり、その戻り値は順序付けされたシーケンスであるが、元のシーケンスlstは変わらない.使用法はsorted(lst)
    
    >>> print(sorted(lst))
    ['55', 'fef', 'haha']
    >>> print(lst.sort())
    None
    

    3.どのように速く1から100までのすべての整数の加算の和を求めますか?
    構想:sum()関数で直接和を求め,ここで伝達関数のシーケンスはrange()関数で生成する.
    
    >>> sum(range(1, 101))
    5050
    

    4.リスト[2,3,4,5]の各要素の立方根を求める.
    lst = [2,3,4,5]
    for i in lst:
        if i != lst[-1]:
            print('%.2f' % (i ** (1 / 3)), end = ' ')
        else:
            print('%.2f' % i ** (1 / 3))
    

    output: 1.26 1.44 1.59 1.71
    5.[‘x’,‘y’,‘z’]および[1,2,3]を[(‘x’,1),(‘y’,2),(‘z’,3)]の形式に変換する.
    構想:zip()関数を使用して、2つのシーケンスをそれぞれ2元グループの形式に結合します.
    >>> a = ['x','y','z']
    >>> b = [1,2,3]
    >>> a, b
    (['x', 'y', 'z'], [1, 2, 3])
    >>> list( zip(a, b) )	#zip       list       
    [('x', 1), ('y', 2), ('z', 3)]