it-swarm.com.de

Warum müssen Sie .iteritems () aufrufen, wenn Sie ein Wörterbuch in Python durchlaufen?

Warum müssen Sie iteritems() aufrufen, um Schlüssel-Wert-Paare in einem Wörterbuch zu durchlaufen? dh

dic = {'one':'1', 'two':'2'}
for k, v in dic.iteritems():
    print k, v

Warum ist das nicht das Standardverhalten beim Durchlaufen eines Wörterbuchs?

for k, v in dic:
    print k, v
129
Falmarri

Für jeden python container C wird das erwartet

for item in C:
    assert item in C

wird gut bestehen - nicht Sie finde es erstaunlich, wenn ein Sinn von in (die Schleifenklausel) eine völlig andere Bedeutung hat als der andere (die Anwesenheitskontrolle)? Würde ich sicher! Das funktioniert natürlich auch für Listen, Mengen, Tupel, ...

Wenn also C ein Wörterbuch ist, wenn in in einer for -Schleife Schlüssel/Wert-Tupel ergibt, dann gilt nach dem Prinzip des geringsten Erstaunens in müsste auch ein solches Tupel als linken Operanden in der Containment-Prüfung verwenden.

Wie nützlich wäre das? Ziemlich nutzlos, im Grunde genommen if (key, value) in C zu einem Synonym für if C.get(key) == value zu machen - das ist eine Prüfung, von der ich glaube, dass ich sie 100-mal seltener durchgeführt habe oder durchführen wollte als if k in C Tatsächlich bedeutet, prüft das Vorhandensein des Schlüssels nur und ignoriert den Wert vollständig.

Auf der anderen Seite ist es durchaus üblich, nur auf Tasten zu schleifen, z.

for k in thedict:
    thedict[k] += 1

auch den Wert zu haben, würde nicht besonders helfen:

for k, v in thedict.items():
    thedict[k] = v + 1

eigentlich etwas weniger klar und weniger prägnant. (Beachten Sie, dass items die ursprüngliche Schreibweise der "richtigen" Methoden war, die zum Abrufen von Schlüssel/Wert-Paaren verwendet wurden. Leider war dies in den Tagen zurück, als solche Accessoren ganze Listen zurückgaben, um "nur Iteration" zu unterstützen Alternative Schreibweisen mussten eingeführt werden, und iteritems war es - in Python 3, wo Abwärtskompatibilitätsbeschränkungen mit früheren Python Versionen waren viel geschwächt, es wurde wieder items).

170
Alex Martelli

Meine Vermutung: Das Verwenden des vollständigen Tupels wäre intuitiver für das Schleifen, aber möglicherweise weniger für das Testen der Mitgliedschaft mit in.

if key in counts:
    counts[key] += 1
else:
    counts[key] = 1

Dieser Code würde nicht wirklich funktionieren, wenn Sie sowohl den Schlüssel als auch den Wert für in angeben müssten. Es fällt mir schwer, mir einen Anwendungsfall vorzustellen, bei dem Sie prüfen würden, ob sowohl der Schlüssel als auch der Wert im Wörterbuch enthalten sind. Es ist viel natürlicher, nur die Tasten zu testen.

# When would you ever write a condition like this?
if (key, value) in dict:

Nun ist es nicht notwendig, dass der in Operator und for ... in Bedienen Sie dieselben Elemente. In Bezug auf die Implementierung handelt es sich um unterschiedliche Operationen (__contains__ vs. __iter__). Aber diese kleine Inkonsistenz wäre etwas verwirrend und natürlich inkonsistent.

9
John Kugelman