/ Valeurs du dictionnaire map / Python map () - python, dictionary, lambda

Valeurs du dictionnaire map () de Python - python, dictionary, lambda

J'essaie d'utiliser map() sur le dict_values objet retourné par le values() fonction sur un dictionnaire. Cependant, je ne peux pas sembler être capable de map() au cours d'une dict_values:

map(print, h.values())
Out[31]: <builtins.map at 0x1ce1290>

Je suis sûr qu'il existe un moyen facile de le faire. Ce que je suis en train de faire est de créer un set() de tous les Counter clés dans un dictionnaire de Counters, faisant quelque chose comme ça:

# counters is a dict with Counters as values
whole_set = set()
map(lambda x: whole_set.update(set(x)), counters.values())

Y a-t-il une meilleure façon de faire cela en Python?

Réponses:

13 pour la réponse № 1

En Python 3, map retourne un itérateur, pas une liste. Vous devez encore itérer dessus, soit en appelant list dessus explicitement, ou en le mettant dans un for boucle. Mais vous ne devriez pas utiliser map de cette façon quand même. map est vraiment pour la collecte des valeurs de retour dans une séquence ou une séquence. Depuis ni print ni set.update renvoie une valeur en utilisant map dans ce cas, ce n’est pas idiomatique.

Votre but est de mettre toutes les clés dans tous les compteurs dans counters en un seul ensemble. Une façon de faire est d'utiliser une expression génératrice imbriquée:

s = set(key for counter in counters.values() for key in counter)

Il y a aussi la belle syntaxe de compréhension de dict, disponible dans Python 2.7 et supérieur (merci Lattyware!) Et pouvant générer des ensembles ainsi que des dictionnaires:

s = {key for counter in counters.values() for key in counter}

Celles-ci sont à peu près équivalentes aux suivantes:

s = set()
for counter in counters.values():
for key in counter:
s.add(key)

0 pour la réponse № 2

Vous voulez l'union de toutes les valeurs de counters? C'est à dire.,

counters[1].union(counters[2]).union(...).union(counters[n])

? C'est juste functools.reduce:

import functools

s = functools.reduce(set.union, counters.values())


Si counters.values() aren "t déjà défini (par exemple, s’ils" correspondent à des listes), vous devez alors les transformer en ensembles en premier. Vous pouvez le faire en utilisant un compréhension de dict en utilisant iteritems, qui est un peu maladroit:

>>> counters = {1:[1,2,3], 2:[4], 3:[5,6]}
>>> counters = {k:set(v) for (k,v) in counters.iteritems()}
>>> print counters
{1: set([1, 2, 3]), 2: set([4]), 3: set([5, 6])}

ou bien sûr vous pouvez le faire en ligne, puisque vous ne vous souciez pas de counters.keys():

>>> counters = {1:[1,2,3], 2:[4], 3:[5,6]}
>>> functools.reduce(set.union, [set(v) for v in counters.values()])
set([1, 2, 3, 4, 5, 6])