流暢なPython-辞書

7656 ワード

1.Pythonでは、標準ライブラリ内のすべてのマッピングタイプがdictによって実現されるため、これらのマッピングのキーとして使用できるのはハッシュ可能なデータ型のみであり、このキーのみが必要であり、値がハッシュ可能なデータ型である必要はないことに注意してください.
Pythonでは原子可変データ型(str、bytes、数値型)はいずれもハッシュ可能タイプであり、frozensetもハッシュ可能タイプであり、その定義に基づいてfrozensetにはハッシュ可能タイプしか収容できないためである.メタグループの場合、1つのメタグループに含まれるすべての要素がハッシュ可能なタイプである場合にのみ、ハッシュ可能です.
一般的に、ユーザがカスタマイズしたタイプのオブジェクトはハッシュ可能であり、ハッシュ値はid()関数の戻り値である.
2.辞書の作成方法は次のとおりです.
a = dict(one=1, two=2, three=3)
b = {'one': 1, 'two': 2, 'three': 3}
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('two', 2), ('one', 1), ('three', 3)])
e = dict({'one': 1, 'two': 2, 'three': 3})
print(a==b==c==d==e)

もちろん、辞書の導出を利用して新しい辞書を作成することもできます.
DIAL_CODES = [
    (86, 'China'),
    (91, "India"),
    (1, "United States"),
    (62, 'Indonesia'),
    (55, 'Brazil'),
    (92, 'Pakistan'),
    (880, "Bangladesh"),
    (234, "Nigeria"),
    (7, 'Russia'),
    (81, 'Japan'),
]

country_code = {country: code for code, country in DIAL_CODES} 
print(country_code)
code_country = {code: country.upper() for country, code in country_code.items() if code < 66}
print(code_country)

 
3.一般的なマッピング方法
 
dict
defaultdict
OrederedDict
 
d.clear()



すべての要素を除去
d.__contains__(k)



kがdにあるかどうかを確認する(kはキー)
d.copy()



浅いレプリケーション
d.__copy__()
 

 
copyをサポートするために使用します.copy
d.default_factory
 

 
で_missing__ 見つからない要素に値を与えるために呼び出された関数
d.__delitem__(k)



del d[k]キーがkの要素を除去
d.fromkeys(it, [initial])



反復器itの要素をマッピングのキーに設定し、initialパラメータがあれば、これらのキーに対応する値とします.(デフォルトはNone)
d.get(k, [default])



キーkに対応する値を返し、辞書にキーkがない場合はNoneまたはdefaultを返します.
d.__getitem__(k)



辞書dがd[k]の形式でキーkに対応する値を返すことができるようにする
d.items()



dのすべてのキー値ペアを返します
d.__iter__()



キーを取得する反復器
d.keys()



すべてのキーを取得
d.__len__()



len(d)の形式で辞書の中のキー値のペアの数を得ることができます
d.__missing__(k)
 

 
とき_getitem__ 対応するキーが見つからない場合、このメソッドが呼び出されます.
d.move_to_end(k, [last])
 
 

キーkの要素を一番前または一番後ろに移動します(lastのデフォルト値はTrue)
d.pop(k, [default])



キーkに対応する値を返し、このキー値ペアを除去する.このキーがない場合はNoneまたはdefaultを返します
d.popitem()



ランダムにキー値ペアを返し、辞書から削除します.
d.__reversed__()
 
 

リバースキーを返す反復器
d.setdefault(k, [default])



辞書にキーkがあれば、kに対応する値を直接返す.なしの場合はd[k]=defaultとしてdefaultを返します
d.__setitem__(k, v)



d[k]=v操作を実現し、kに対応する値をvにする
d.update(m, [**kargs])



mは、d内の対応するエントリを更新するためにマッピングまたはキー値対反復器であってもよい
d.values()



辞書のすべての値を返します.
見つからないキーをsetdefaultで処理します.例は次のとおりです.
"""                """
import sys
import re

WORD_RE = re.compile(r'\w+')

index = {}
with open("xx.txt",  encoding='UTF-8') as fp:
    # enumerate(sequence, [start=0]) sequence --     、            。start --       。
    for line_no, line in enumerate(fp, 1):
        for match in WORD_RE.finditer(line):
            word = match.group()
            column_no = match.start() + 1
            location = (line_no, column_no)
            #           
            occurrences = index.get(word, [])
            occurrences.append(location)
            index[word] = occurrences
            #            
            #            ,       ,             ,         
            #                      
            index.setdefault(word, []).append(location)
#           
for word in sorted(index, key=str.upper):
    print(word, index[word])

上記の2つの実装では、両方の効果は同じですが、前者は少なくとも両側キークエリーを行います.キーが存在しない場合は3回、setdefaultでは1回で操作全体を完了できます.
 
4.マッピングされたフレックスキークエリー
便宜上、あるキーがマッピングに存在しなくても、このキーで値を読み出すときにデフォルト値を得たい場合があります.この目的を達成するには2つの方法があります.1つはdefaultdictというタイプで普通のdictではなく、もう1つは自分でdictのサブクラスを定義し、サブクラスで__を実現することです.missing__方法.
方法は次のとおりです.
import sys
import re
import collections

WORD_RE = re.compile(r'\w+')

#  list      default_factory     defaultdict
index = collections.defaultdict(list) 
with open(sys.argv[1], encoding='UTF-8') as fp:
    # enumerate(sequence, [start=0]) sequence --     、            。start --       。
    for line_no, line in enumerate(fp, 1):
        for match in WORD_RE.finditer(line):
            word = match.group()
            column_no = match.start() + 1
            location = (line_no, column_no)
            #   index   word   ,  default_factory    ,            。
            #             ,            index[word],          
            #   ,append(location)      
            index[word].append(location)

#           
for word in sorted(index, key=str.upper):
    print(word, index[word])

defaultdictオブジェクトを作成するときは、キーが見つからないデフォルト値を作成する方法を構成する必要があります.具体的には、defaultdictをインスタンス化する場合、構造メソッドに呼び出し可能なオブジェクトを提供する必要があります.この呼び出し可能なオブジェクトは_getitem__見つからないキーに出会ったときに呼び出され、getitem__既定値を返します.
たとえば、defaultdictをインスタンス化するときにlist呼び出し可能なオブジェクトを提供しました.getitem__キーが見つからない場合は、手順を押して行きます.
1.list()を呼び出して新しいリストを作成する
2.この新しいリストを値とし、見つからないキーをそのキーとして辞書に入れる
3.このリストの参照を返します
デフォルト値を生成するために使用される呼び出し可能なオブジェクトはdefault_という名前で保存されます.factoryのインスタンスプロパティにあります.defaultdictの作成時にdefault_が指定されていない場合factory、クエリが存在しないキーはKeyErrorをトリガーします.
方法2(_missing_)次のようになります.

class StrKeyDict0(dict):

    def __missing__(self, key):
        if isinstance(key, str):    #               ,      
            raise KeyError(key)
        return self[str(key)]   #            ,               

        def get(self, key, default=None):
            try:
                # get        self[key]      __getitem__,           
                #      __missing__          
                return self[key]
            except KeyError:
                return default

        def __contains__(self, key):
            return key in self.keys() or str(key) in self.keys()

if __name__ == "__main__":
    d = StrKeyDict0([('2', 'two'), ('4', 'four')])
    print(d[2])
    print(d['2'])
    print(d.get('2'))
    print(d.get(2))
    print(d.get(1, '   '))

注意:_missing__メソッドは_getitem__呼び出し(式d[k]など).kin dict.keys()のような操作はPython 3では速く、dict.keys()が返す値が「ビュー」であるため、マッピングタイプオブジェクトが膨大であっても構わない.ビューはコレクションのようなもので、辞書と似ています.ビューで要素を検索するのは速いです.
 
Collections.Counterは、キーに整数カウンタを用意する便利なマッピングタイプです.キーを更新するたびにこのカウンタが追加されます.したがって、このタイプは、ハッシュ可能なオブジェクト技術に使用したり、多重セットとして使用したりすることができます.
ct = collections.Counter(["Hello", "sss", "sss", "sss", "hello"])
print(ct)

 
5.可変マッピングタイプ
Python 3から3からtypesモジュールはMappingProxyTypeというパッケージクラスを導入した.このクラスにマッピングを与えると、読み取り専用のマッピングビューが返されます.読み取り専用のビューですが、元のマッピングが変更された場合、このビューで観察できますが、このビューで元のマッピングを変更することはできません.
from types import MappingProxyType

d = {1: 'A'}
d_proxy = MappingProxyType(d)
print(d_proxy)  # d        d_proxy  
# d_proxy[1] = 'X'  #     d_proxy        
print(d_proxy)
d[1] = 'X'
print(d_proxy)  # d_proxy    ,  d