Python3.7 以降では dict の順序(追加された順番)が保証されるようになりました。
当たり前の動作に思えますが、Python のバージョンによっては当たり前ではないため確認する必要があり、実際に以下の動作になることが確認できました。
next, iter
test = {"key1":"value2", "key2":"value1"}
test_iter = iter(test)
print(next(test_iter))
print(next(test_iter))
# 実行結果
key1
key2
test = {"key1":"value2", "key2":"value1"}
test_iter2 = iter(test.values())
print(next(test_iter2))
print(next(test_iter2))
# 実行結果
value2
value1
上記結果より、next, iter を使うことで、dict に追加した順の index を取得することが可能になります。
mapping
Python3.10 以降 mapping が追加されたようです。
一言で言ってしまえば、values や key から元の dict に戻す感じですが、type が types.MappingProxyType になるようです。
具体的には以下の動作になります。
test = {"key1":"value2", "key2":"value1"}
print(test.values().mapping)
print(test.keys().mapping)
# 実行結果
{'key1': 'value2', 'key2': 'value1'}
{'key1': 'value2', 'key2': 'value1'}
異なる type になるようなので、以下になるようです。
print(type(test) == type(test.keys().mapping), type(test) ,type(test.keys().mapping))
print(test == test.values().mapping)
# 実行結果
False <class 'dict'> <class 'mappingproxy'>
True
type が異なっても、== は True になるところは興味深いです。
mapping と .values() は繰り返し使えそうなので試すと、繰り返し使えるようです。
print(test.values().mapping.values().mapping)
# 実行結果
{'key1': 'value2', 'key2': 'value1'}