Code: Alles auswählen
len(paar for paar in paar_dict.items() if paar[0]==paar[1])Code: Alles auswählen
len(x0 for (x0,x1) in paar_dict.items() if x0==x1)(Python-Folklore sagt ja, es solle möglichst immer nur eine offensichtliche Art geben
Code: Alles auswählen
len(paar for paar in paar_dict.items() if paar[0]==paar[1])Code: Alles auswählen
len(x0 for (x0,x1) in paar_dict.items() if x0==x1)Code: Alles auswählen
sum(1 for key in paar_dict if key == paar_dict[key])Man kann Wahrheitswerte auch addieren (True+True ergibt 2). Deswegen geht auch das:Code: Alles auswählen
sum(1 for key in paar_dict if key == paar_dict[key])
Code: Alles auswählen
sum(k==d[k] for k in d)Das ist mir bekannt und diese Idee hatte ich auch schon ausprobiert. Es hat sich aber gezeigt, dass hier sozusagen alle Elemente aus der List Comprehension herauskommen und dies langsamer ist, als wenn man bereits in der LC filtert und nur zutreffende Elemente auswirft. Wenn du testen willst, dann empfehle ich IPython, weil du in dessen Shell nur ein "timeit" vor den Python-Ausdruck schreiben muss und schon macht IPython eine Zeitmessung für dich.Üpsilon hat geschrieben:Man kann Wahrheitswerte auch addieren (True+True ergibt 2). Deswegen geht auch das:Ohne es getestet zu haben, glaube ich, dass das n bissl schneller ist.Code: Alles auswählen
sum(k==d[k] for k in d)
Code: Alles auswählen
In [1]: d = {'a':'a', 'b':'b', 'c':'c', 'd':'e', 'e':'f', 'f':'g'}
In [2]: %timeit sum(d[k]==k for k in d)
100000 loops, best of 3: 2.12 µs per loop
In [4]: %timeit sum(1 for k in d if k==d[k])
1000000 loops, best of 3: 1.75 µs per loop
In [5]: %timeit sum(1 for k, v in d.items() if k==v)
1000000 loops, best of 3: 1.92 µs per loopCode: Alles auswählen
In [10]: %timeit sum(d[k]==k for k in d)
100 loops, best of 3: 15.7 ms per loop
In [11]: %timeit sum(1 for k in d if d[k]==k)
100 loops, best of 3: 13.9 ms per loop
In [12]: %timeit sum(1 for k, v in d.iteritems() if k==v)
100 loops, best of 3: 10.1 ms per loopZugegeben: ich war zu faul, mal eben ein großes Dictionary aufzubauen. Bei nun verlängerten Laufzeiten zeigt dein Beispiel, dass die langsamste Lösung die langsamste bleibt (so wie es zu vermuten war), sich aber die Reihenfolge der beiden schnellen Lösungen umkehrt.Sirius3 hat geschrieben:Hier ein Beispiel mit 10000 Dictionary-Einträgen
Code: Alles auswählen
In [18]: %timeit sum(d[k]==k for k in d)
100 loops, best of 3: 2.38 ms per loop
In [19]: %timeit sum(1 for k in d if k==d[k])
1000 loops, best of 3: 1.65 ms per loop
In [20]: %timeit sum(1 for k,v in d.items() if k==v)
1000 loops, best of 3: 1.33 ms per loopDas ist sicherlich richtig.Sirius3 hat geschrieben:In erster Linie sollte man also so programmieren, wie es am lesbarsten ist.
Code: Alles auswählen
nullbereich = [x for (x,ffx) in ff.items() if ffx==0]
for x in nullbereich: del(ff[x])
Code: Alles auswählen
ff = dict((x, ffx) for x, ffx in ff.iteritems() if ffx != 0)