collections Sammlungen enthalten Container-Datentypen. In Python3 (3.4.3) gibt es einige Ergänzungen zu Python2.7. Referenz-URL: http://docs.python.jp/3.4/library/collections.html Die aus Python2.7 hinzugefügten Punkte lauten wie folgt.
ChainMap: Eine wörterbuchähnliche Klasse, die eine einzelne Ansicht mehrerer Zuordnungen erstellt UserDict: Ein Wrapper für Wörterbuchobjekte, der die Unterklasse von Wörterbüchern vereinfacht UserList: Listenobjekt-Wrapper, der die Unterklassifizierung von Listen vereinfacht UserString: Ein Wrapper für Zeichenfolgenobjekte, mit dem Zeichenfolgen einfach in Unterklassen unterteilt werden können
Benutzer ~ ist normalerweise ein Klassen-Wrapper, daher wird die Erklärung weggelassen.
ChainMap
Der Code, den ich dieses Mal geschrieben habe, ist auf GitHub. (https://github.com/KodairaTomonori/Qiita/blob/master/default_module/collections/test_ChainMap.py) Zunächst aus der einfachen Verwendung von 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}]
Wie der Name schon sagt, verbindet ChainMap`` map (dictionaly)
.
Anstatt sie nur zu verbinden, können Sie jedes als Wörterbuch behalten.
Wie Sie der Ausgabe entnehmen können, ist "dict_a" und "dict_b" getrennt.
Wenn Sie "chain ['z']" und "chain_map ['b']" ausführen, erhalten Sie "2" bzw. "12".
Wenn Sie es verwenden, können Sie es normalerweise als ein "Diktat" verwenden.
Durch Setzen von ".new_child ()" wird zu Beginn ein neues "Diktat" erstellt.
Durch Festlegen von ".maps" wird ChainMap aufgelistet und zurückgegeben.
Obwohl nicht im Code geschrieben, können Sie ".items (), .keys (), .values ()" wie normales "dict" verwenden. Wenn man sich die Referenz-URL ansieht, scheint die Suche von vorne zu kommen und die anderen nur von vorne.
Die Suche sucht weiterhin nach der zugrunde liegenden Zuordnung, bis der Schlüssel gefunden wird. Im Gegensatz dazu werden Schreiben, Aktualisieren und Löschen nur bei der ersten Zuordnung ausgeführt.
Als nächstes werden wir aktualisieren.
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})
Das Schreiben oder Aktualisieren des untergeordneten Elements (Diktat ganz links) ändert das übergeordnete Element nicht (Diktat ganz links). Wenn Sie das übergeordnete Element ändern, wird die Änderung auch in "Kind" angezeigt. Die Zeiger der gemeinsamen Elemente von "chain_map" und "child" scheinen auf dieselbe Stelle zu verweisen.
Wie man ein Wörterbuch erstellt, wenn etwas unordentlich und schwer zu sehen ist. Sie können es einfach in dict () einschließen.
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 ist praktisch, aber ich kann mir keine Verwendung dafür vorstellen.
Diese Klasse kann zum Simulieren verschachtelter Bereiche verwendet werden und ist nützlich für die Zuordnung.
Obwohl es in der Referenz-URL geschrieben ist, verstehe ich es nicht gut, weil es nur Katakana ist. Es scheint, dass es verwendet werden kann, um die Aktualisierung der Gewichte beim Lernen mit NLP zu überprüfen.
Recommended Posts