Zählen von Einträgen in einer Liste von dictionaries: for-Schleife vs. list comprehension mit Karte(itemgetter)

In ein Python-Programm, das ich Schreibe, habe ich im Vergleich mit einem for Schleife und einer Schrittweite von Variablen versus Liste Verständnis mit map(itemgetter) und len() beim zählen der Einträge in Wörterbüchern, die in einer Liste. Es nimmt die gleiche Zeit, die mit einer einzelnen Methode. Mache ich etwas falsch oder gibt es einen besseren Ansatz?

Hier ist eine stark vereinfachte und verkürzte Datenstruktur:

list = [
  {'key1': True, 'dontcare': False, 'ignoreme': False, 'key2': True, 'filenotfound': 'biscuits and gravy'},
  {'key1': False, 'dontcare': False, 'ignoreme': False, 'key2': True, 'filenotfound': 'peaches and cream'},
  {'key1': True, 'dontcare': False, 'ignoreme': False, 'key2': False, 'filenotfound': 'Abbott and Costello'},
  {'key1': False, 'dontcare': False, 'ignoreme': True, 'key2': False, 'filenotfound': 'over and under'},
  {'key1': True, 'dontcare': True, 'ignoreme': False, 'key2': True, 'filenotfound': 'Scotch and... well... neat, thanks'}
]

Hier ist die for loop-version:

#!/usr/bin/env python
# Python 2.6
# count the entries where key1 is True
# keep a separate count for the subset that also have key2 True

key1 = key2 = 0
for dictionary in list:
    if dictionary["key1"]:
        key1 += 1
        if dictionary["key2"]:
            key2 += 1
print "Counts: key1: " + str(key1) + ", subset key2: " + str(key2)

Ausgang für die Daten oben:

Counts: key1: 3, subset key2: 2

Hier ist die andere, vielleicht mehr Pythonic, version:

#!/usr/bin/env python
# Python 2.6
# count the entries where key1 is True
# keep a separate count for the subset that also have key2 True
from operator import itemgetter
KEY1 = 0
KEY2 = 1
getentries = itemgetter("key1", "key2")
entries = map(getentries, list)
key1 = len([x for x in entries if x[KEY1]])
key2 = len([x for x in entries if x[KEY1] and x[KEY2]])
print "Counts: key1: " + str(key1) + ", subset key2: " + str(key2)

Ausgang für die Daten oben (dieselbe wie vorher):

Counts: key1: 3, subset key2: 2

Ich bin ein klein wenig überrascht, diese nehmen die gleiche Menge an Zeit. Ich Frage mich, ob es etwas schneller. Ich bin sicher, ich bin etwas Blick einfach.

Einer alternative, die ich betrachtet habe, ist das laden der Daten in eine Datenbank und dabei SQL-Abfragen, aber die Daten nicht beibehalten werden muss und ich würde ein Profil der overhead der Datenübertragung, etc., und kann eine Datenbank nicht immer verfügbar sein.

Ich habe keine Kontrolle über die ursprüngliche form der Daten.

Der code oben ist nicht für style-Punkte.

Schreibe einen Kommentar