2
votes

Existe-t-il un moyen plus efficace d'itérer une liste de dictionnaires?

J'essaie de parcourir une liste de dictionnaires et de ne conserver que ceux avec une valeur d'année dans leur clé yearID . Essentiellement, la liste ( statistiques ) est des statistiques de baseball et chaque ligne (dictionnaire) sont les statistiques d'un joueur pendant une année.

Ce code semble fonctionner très bien (pour TRES petites listes de dictionnaires ), mais dès que la taille de la liste dépasse 40 ou 50, Thonny écrase:

def filter_by_year(statistics, year, yearid):

    nlist = []
    for dicts in statistics:
        if str(dicts[yearid]) == str(year):
            nlist.append(dicts)

    return nlist


2 commentaires

Ce code fonctionnera, et sera suffisamment efficace, pour 100.000 - 1.000.000 de dicionnaires si vous en avez besoin.


Pourquoi comparez-vous les représentations sous forme de chaîne des années au lieu de comparer directement les années? dicts [yearid] == année . Les conversions en chaînes prennent sûrement beaucoup de temps.


5 Réponses :


1
votes

Je ne sais pas si c'est plus efficace, mais une compréhension de liste est un code plus propre:

return [dicts for dicts in statistics if str(dicts[yearid]) == str(year)]


0 commentaires

2
votes

Cela dépend de ce que vous entendez par «efficace». Votre code devrait fonctionner correctement pour de grandes quantités de dictionnaires, donc je suppose que vous voulez dire efficace en termes de code écrit.

Dans ce cas, nlist peut être simplifié en une simple compréhension de liste:

[dicts for dicts in statistics if str(dicts[yearid]) == str(year)]


0 commentaires

0
votes

Un filtre peut également être un bon moyen

def filter_by_year(statistics, year, yearid):
    nlist = list(filter (lambda dicts: str(dicts[yearid]) == str(year), statistics))
    return nlist


0 commentaires

0
votes

Vous pouvez utiliser un générateur pour saisir uniquement l'année et garder l'index du dictionnaire en cours d'itération.

def filter_by_year(statistics, year, yearid):

    nlist = []

    for i, yearid_ in enumerate(dict[yearid] for dict in statistics): 
        if str(yearid_) == str(year):
            nlist.append(statistics[i])

    return nlist


0 commentaires

2
votes

De toutes les méthodes présentées jusqu'à présent (par prashant rana , Zaid Afzal , alec_a et Steven Burnap em >), le vôtre - celui d'origine - est le plus efficace. Cela devient un peu 3x plus rapide si vous éliminez la conversion inutile en chaînes:

def filter_by_year(statistics, year, yearid): 
    nlist = [] 
    for dicts in statistics: 
        if dicts[yearid] == year: 
            nlist.append(dicts) 
    return nlist 


0 commentaires