web-dev-qa-db-fra.com

Nombre d'éléments Python dans la valeur dict qui est une liste

Python 3.3, un dictionnaire avec des paires clé-valeur sous cette forme. 

d = {'T1': ['eggs', 'bacon', 'sausage']}

Les valeurs sont des listes de longueur variable, et je dois parcourir les éléments de la liste. Cela marche: 

count = 0
for l in d.values():
   for i in l: count += 1

Mais c'est moche. Il doit y avoir une façon plus pythonique, mais je n'arrive pas à le trouver.

len(d.values()) 

produit 1. C'est 1 liste (DUH). Les tentatives avec Counter from here donnent des erreurs de type 'inshashable' 

11
RolfBly

Utilisez sum() et les longueurs de chacune des valeurs du dictionnaire:

count = sum(len(v) for v in d.itervalues())

Si vous utilisez Python 3, utilisez simplement d.values().

Démo rapide avec votre échantillon d’entrée et l’un des miens:

>>> d = {'T1': ['eggs', 'bacon', 'sausage']}
>>> sum(len(v) for v in d.itervalues())
3
>>> d = {'T1': ['eggs', 'bacon', 'sausage'], 'T2': ['spam', 'ham', 'monty', 'python']}
>>> sum(len(v) for v in d.itervalues())
7

Counter ne vous aidera pas beaucoup ici, vous ne créez pas de compte par entrée, vous calculez la longueur totale de toutes vos valeurs.

38
Martijn Pieters
>>> d = {'T1': ['eggs', 'bacon', 'sausage'], 'T2': ['spam', 'ham', 'monty', 'python']}
>>> sum(map(len, d.values()))
7
9
John La Rooy

Je faisais mes devoirs dans Treehouse. Cela peut être simplifié au moins une étape (à ma connaissance), mais il serait peut-être plus facile pour les débutants (comme moi) de comprendre cette version.

dict = {'T1': ['eggs', 'bacon', 'sausage'], 'T2': ['bread', 'butter', 'tosti']}

total = 0

for value in dict:
    value_list = dict[value]
    count = len(value_list)
    total += count

print(total)
0
Rik Schoonbeek

Je cherchais une réponse à cette question lorsque j'ai découvert ce sujet jusqu'à ce que je réalise que j'avais déjà quelque chose dans mon code pour l'utiliser. Voici ce que je suis venu avec:

count = 0

for key, values in dictionary.items():
        count = len(values)

Si vous souhaitez enregistrer le nombre pour chaque élément du dictionnaire, vous pouvez créer un nouveau dictionnaire pour enregistrer le nombre pour chaque clé.

count = {}

for key, values in dictionary.items():
        count[key] = len(values)

Je ne pouvais pas trouver exactement à partir de quelle version cette méthode est disponible, mais je pense que la méthode .items est uniquement disponible dans Python 3.

0
Jeffrey