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 № 1En 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])