collections Les collections contiennent des types de données de conteneur. Dans python3 (3.4.3), il y a quelques ajouts à celui de python2.7. URL de référence: http://docs.python.jp/3.4/library/collections.html Les points ajoutés à partir de python2.7 sont les suivants.
ChainMap: une classe de type dictionnaire qui crée une vue unique de plusieurs mappages UserDict: un wrapper pour les objets de dictionnaire qui simplifie la sous-classification du dictionnaire UserList: wrapper d'objet de liste qui simplifie la sous-classification de liste UserString: un wrapper pour les objets chaîne qui facilite la sous-classe des chaînes
L'utilisateur ~ est généralement un wrapper de classe, donc l'explication est omise.
ChainMap
Le code que j'ai écrit cette fois est sur GitHub. (https://github.com/KodairaTomonori/Qiita/blob/master/default_module/collections/test_ChainMap.py) Tout d'abord, de la simple utilisation de ChainMap
test_ChainMap.py
import collections
import see
dict_a = dict(a=1, b=2, c=3)
dict_b = dict(x=10, y=11, z=12)
def get_name(arg_id, arg_values):
for key, value in arg_values.items():
if id(value) == arg_id: return key
return 'NotDefined'
def print_arguments(*args, arg_values):
for arg in args:
print(get_name(id(arg), arg_values) + ' : ' + repr(arg) )
chain_map = collections.ChainMap(dict_a, dict_b)
child = chain_map.new_child()
print('make_chain_maps')
print_arguments(chain_map, child, arg_values=locals() )
print('chain_map.maps: ' + repr(chain_map.maps) )
make_chain_maps chain_map : ChainMap({'b': 2, 'c': 3, 'a': 1}, {'z': 12, 'x': 10, 'y': 11}) child : ChainMap({}, {'b': 2, 'c': 3, 'a': 1}, {'z': 12, 'x': 10, 'y': 11}) chain_map.maps: [{'a': 1, 'c': 3, 'b': 2}, {'y': 11, 'z': 12, 'x': 10}]
Comme son nom l'indique, ChainMap
connecte la carte (dictionaly). Au lieu de simplement les connecter, vous pouvez conserver chacun d'eux sous forme de dictionnaire. Ainsi, comme vous pouvez le voir dans la sortie, chacun des
dict_a et dict_best séparé. Si vous faites
chain ['z'] et chain_map ['b'], vous obtiendrez respectivement '2 et 12'. Lorsque vous l'utilisez, vous pouvez l'utiliser normalement comme un seul
dict. En définissant
.new_child (), un nouveau
dictsera créé au début. En définissant
.maps`, ChainMap sera répertorié et renvoyé.
Bien que cela ne soit pas écrit dans le code, vous pouvez utiliser .items (), .keys (), .values ()
comme normal dict
.
En regardant l'URL de référence, il semble que la recherche se fasse par l'avant et les autres seulement par l'avant.
La recherche continue de rechercher le mappage sous-jacent jusqu'à ce que la clé soit trouvée. En revanche, l'écriture, la mise à jour et la suppression ne fonctionnent que sur le premier mappage.
Ensuite, nous mettrons à jour.
update.py
child.update(d=4, a=0)
print('update_child_map')
print_arguments(chain_map, child, arg_values=locals() )
print()
chain_map.update(z=100)
print('update_parent_map')
print_arguments(chain_map, child, arg_values=locals() )
update_child_map chain_map : ChainMap({'a': 1, 'c': 3, 'b': 2}, {'y': 11, 'z': 12, 'x': 10}) child : ChainMap({'a': 0, 'd': 4}, {'a': 1, 'c': 3, 'b': 2}, {'y': 11, 'z': 12, 'x': 10}) update_parent_map chain_map : ChainMap({'a': 1, 'z': 100, 'c': 3, 'b': 2}, {'y': 11, 'z': 12, 'x': 10}) child : ChainMap({'a': 0, 'd': 4}, {'a': 1, 'z': 100, 'c': 3, 'b': 2}, {'y': 11, 'z': 12, 'x': 10})
L'écriture ou la mise à jour vers l'enfant (dict le plus à gauche) ne change pas le parent (dict autre que le dict le plus à gauche).
De plus, si vous changez de parent, le changement sera reflété dans «enfant».
Les pointeurs des éléments communs de chain_map et child
semblent pointer vers le même endroit.
Comment créer un dictionnaire lorsque quelque chose est désordonné et difficile à voir. Vous pouvez simplement le mettre dans dict ().
merge.py
print('each_Chain')
print('chain_map:', dict(**chain_map) )
print('child :', dict(**child) )
each_Chain chain_map: {'x': 10, 'z': 100, 'c': 3, 'b': 2, 'a': 1, 'y': 11} child : {'x': 10, 'z': 100, 'c': 3, 'b': 2, 'a': 0, 'd': 4, 'y': 11}
ChainMap est pratique, mais je ne vois aucune utilité pour cela.
Cette classe peut être utilisée pour simuler des portées imbriquées et est utile pour le mappage.
Bien qu'il soit écrit dans l'URL de référence, je ne comprends pas bien car il ne s'agit que de Katakana. Il semble qu'il puisse être utilisé pour vérifier la mise à jour des poids lors de l'apprentissage avec la PNL.
Recommended Posts