Python データ構造アルゴリズムの質問 12: 辞書のソート

質問:

ディクショナリを作成し、ディクショナリを反復またはシリアル化するときに要素の順序を制御できるようにしたいと考えています。

解決:

ディクショナリ内の要素の順序を制御するには、コレクション モジュールの OrderedDict クラスを使用できます。反復操作中に要素が挿入された順序が維持されます。

from collections import OrderedDict
d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 3
d['grok'] = 4
# Outputs "foo 1", "bar 2", "spam 3", "grok 4"
for key in d: print(key, d[key])

OrderedDict は、将来シリアル化または他の形式にエンコードする必要があるマップを構築する場合に役立ちます。たとえば、JSON でエンコードされたフィールドの順序を正確に制御したい場合は、まず OrderedDict を使用してそのようなデータを構築します。

>>> import json
>>> json.dumps(d)
'{"foo": 1, "bar": 2, "spam": 3, "grok": 4}' >>>

OrderedDict は、キーの挿入順序に従ってソートされた二重リンク リストを内部的に維持します。新しい要素が挿入されるたびに、その要素はリンクされたリストの最後に配置されます。既存のキーに繰り返し割り当てても、キーの順序は変更されません。

OrderedDict は内部的に別のリンクされたリストを保持するため、通常の辞書の 2 倍のサイズになることに注意してください。したがって、多数の OrderedDict インスタンスを必要とするデータ構造を構築している場合 (100,000 行の CSV データを OrderedDict リストに読み取る場合など)、OrderedDict を使用する利点が追加のメモリの影響を上回るかどうかを慎重に検討する必要があります。消費。

a={
    
    
'x' : 1,
'y' : 2,
'z' : 3 }
b={
    
    
'w' : 10,
'x' : 11,
'y' : 2 }

2 つの辞書間の類似点を見つけるには、両方の辞書の key() メソッドまたは items() メソッドによって返された結果に対して set 操作を実行するだけです。例えば:

# Find keys in common
a.keys() & b.keys() # {
    
     'x', 'y' } # Find keys in a that are not in b a.keys() - b.keys() # {
    
     'z' }
# Find (key,value) pairs in common a.items() & b.items() # {
    
     ('y', 2) }

これらの操作を使用して、辞書要素を変更またはフィルタリングすることもできます。たとえば、既存の辞書から特定のキーを除外した新しい辞書を構築するとします。

# Make a new dictionary with certain keys removed
c = {
    
    key:a[key] for key in a.keys() - {
    
    'z', 'w'}} # c is {
    
    'x': 1, 'y': 2}

ディクショナリは、キーのセットと値のセットの間のマッピング関係です。ディクショナリの key() メソッドは、キー コレクションを表示するキー ビュー オブジェクトを返します。キー ビューのあまり理解されていない機能は、集合演算、積和演算、交差演算、差分演算などの集合演算もサポートしていることです。したがって、コレクションのキーに対して通常のセット操作を実行する場合は、キー ビュー オブジェクトを最初にセットに変換せずに直接使用できます。

ディクショナリの items() メソッドは、(キー、値) ペアを含む要素ビュー オブジェクトを返します。このオブジェクトは集合演算もサポートしており、2 つの辞書で同じキーと値のペアを検索するために使用できます。

ディクショナリの value() メソッドは似ていますが、ここで紹介する集合演算はサポートされていません。これは、値ビューがすべての値が互いに異なることを保証できないことが部分的に原因です。

おすすめ

転載: blog.csdn.net/m0_68635815/article/details/135439550