OrderedDict秩序辞書およびjson列の読み取り時に元の順序を維持する方法
2568 ワード
OrderedDictの順序付け辞書と、json列を読み込むときに元の順序を維持する方法OrderedDictはdictのサブクラスであり、コンテンツが追加された順序を覚えています.比較する場合、OrderedDictは内容と順序が完全に同じでなければ等しいと見なされません.
例:
結果:3 A 2 B 1 C
dが一般的なdictである場合、結果は:
1 C 2 B 3 A
2.json列の読み出し時に元の順序を維持する方法
metadataにおけるpropertiesの順序はtextで定義された順序と同じである.
具体的にはpythonドキュメントのjsonを参照してください.loads関数のパラメータ
Python 3.6はdictの内部アルゴリズムを書き換えたので、3.6のdictは秩序化されています.このバージョン以前はすべて無秩序(解答を書く現在の最新版は3.6)で、PEP 468を参照して読むことができます.PEP 468によると、この改善はdictのメモリ消費量を約20%-25%削減します.(Python 3.5と比較)3.6のdictが従う順序はKeyの挿入順序であることに注意する.つまり、整列した結果を得るには一定の順序で挿入する必要があり、そうでなければsortが必要である.また、同様にHashテーブルで実現されたsetは3.6でも無秩序な状態であり、これは変更されていないが、低バージョンではcollections.OrderedDictが使用できることを望む.これは2.7で既に実装されているした容器.同様に挿入順序に従います.
作者:绚瀬绘里链接:https://www.zhihu.com/question/24306558/answer/374075597出典:著作権は作者の所有であることを知っている.商業転載は著者に連絡して許可を得てください.非商業転載は出典を明記してください.
辞書の本質はhashテーブルhashテーブルのデータ構造が無秩序であることを定めている.hashテーブルの内部構造および実装については,「アルゴリズム導論」を参照することができる.
作者:無名氏リンク:https://www.zhihu.com/question/24306558/answer/27358613出典:著作権は作者の所有であることを知っている.商業転載は著者に連絡して許可を得てください.非商業転載は出典を明記してください.
その本には何が書かれているのか…(以下、HashをHash Tableと略す)Hashの考え方は簡単で、index sortingと1つのカーネル、1つのArrayを申請し、Arrayの位置をメタデータとしてindexに並べ替えたとき、素朴で、数値の大きさはarrayを入れる位置であり、例を挙げるとint Aがある[6].私は2 5 4 8を並べ替えてこれらの数をそれぞれArrayの2 5 4 8ビットに入れて、それから順番に読み出して、数列はO(n)の速度でHashとIndexを並べ終わったのとは違って、数値からArrayの位置へのマッピングは違っていて、Index sortingでは、数値がArrayの位置にあるのは数値そのものがHashの中にあるので、変化のアルゴリズムで、KeyでArrayの位置を算出して、Valueを入れる例えば私のKeyは10で、Hashの中で、ValueをArrayの位置2の上で置くかもしれませんこのようなアルゴリズムの下で、挿入の順序は推定できません.1回目の操作では、Key 2 Value 90がHash Table Aに挿入する、算出位置が5回目の操作で、Key 9 Value 10がHash Table Aに挿入され、算出位置が3であることに気づいたか、Hash Tableが挿入の順番を保証していない後のデータは先に挿入するデータの前に走ることができる.Hashの本質は、1つの数列をKeyとしてできるだけ別の数列Valueをプログラムが申請したArrayに平均的に割り当てることである.最後に関係のないことを言うと、辞書の乱序の原因にもなる.Pythonは自動的に辞書を拡張します.
例:
import collections
d = collections.OrderedDict()
d[3] = 'A'
d[2] = 'B'
d[1] = 'C'
for k, v in d.items():
print k, v
結果:3 A 2 B 1 C
dが一般的なdictである場合、結果は:
1 C 2 B 3 A
2.json列の読み出し時に元の順序を維持する方法
import json
from collections import OrderedDict
metadata = json.loads(text, object_pairs_hook=OrderedDict);
metadataにおけるpropertiesの順序はtextで定義された順序と同じである.
具体的にはpythonドキュメントのjsonを参照してください.loads関数のパラメータ
Python 3.6はdictの内部アルゴリズムを書き換えたので、3.6のdictは秩序化されています.このバージョン以前はすべて無秩序(解答を書く現在の最新版は3.6)で、PEP 468を参照して読むことができます.PEP 468によると、この改善はdictのメモリ消費量を約20%-25%削減します.(Python 3.5と比較)3.6のdictが従う順序はKeyの挿入順序であることに注意する.つまり、整列した結果を得るには一定の順序で挿入する必要があり、そうでなければsortが必要である.また、同様にHashテーブルで実現されたsetは3.6でも無秩序な状態であり、これは変更されていないが、低バージョンではcollections.OrderedDictが使用できることを望む.これは2.7で既に実装されているした容器.同様に挿入順序に従います.
作者:绚瀬绘里链接:https://www.zhihu.com/question/24306558/answer/374075597出典:著作権は作者の所有であることを知っている.商業転載は著者に連絡して許可を得てください.非商業転載は出典を明記してください.
辞書の本質はhashテーブルhashテーブルのデータ構造が無秩序であることを定めている.hashテーブルの内部構造および実装については,「アルゴリズム導論」を参照することができる.
作者:無名氏リンク:https://www.zhihu.com/question/24306558/answer/27358613出典:著作権は作者の所有であることを知っている.商業転載は著者に連絡して許可を得てください.非商業転載は出典を明記してください.
その本には何が書かれているのか…(以下、HashをHash Tableと略す)Hashの考え方は簡単で、index sortingと1つのカーネル、1つのArrayを申請し、Arrayの位置をメタデータとしてindexに並べ替えたとき、素朴で、数値の大きさはarrayを入れる位置であり、例を挙げるとint Aがある[6].私は2 5 4 8を並べ替えてこれらの数をそれぞれArrayの2 5 4 8ビットに入れて、それから順番に読み出して、数列はO(n)の速度でHashとIndexを並べ終わったのとは違って、数値からArrayの位置へのマッピングは違っていて、Index sortingでは、数値がArrayの位置にあるのは数値そのものがHashの中にあるので、変化のアルゴリズムで、KeyでArrayの位置を算出して、Valueを入れる例えば私のKeyは10で、Hashの中で、ValueをArrayの位置2の上で置くかもしれませんこのようなアルゴリズムの下で、挿入の順序は推定できません.1回目の操作では、Key 2 Value 90がHash Table Aに挿入する、算出位置が5回目の操作で、Key 9 Value 10がHash Table Aに挿入され、算出位置が3であることに気づいたか、Hash Tableが挿入の順番を保証していない後のデータは先に挿入するデータの前に走ることができる.Hashの本質は、1つの数列をKeyとしてできるだけ別の数列Valueをプログラムが申請したArrayに平均的に割り当てることである.最後に関係のないことを言うと、辞書の乱序の原因にもなる.Pythonは自動的に辞書を拡張します.