/ / Valores de dicionário do mapa Python () - python, dicionário, lambda

Valores do dicionário do mapa Python () - python, dicionário, lambda

Estou tentando usar map() no dict_values objeto retornado pelo values() função em um dicionário. No entanto, eu não consigo parecer map() através de um dict_values:

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

Tenho certeza de que há uma maneira fácil de fazer isso. O que estou realmente tentando fazer é criar um set() de todos os Counter chaves em um dicionário de Counters, fazendo algo assim:

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

Existe uma maneira melhor de fazer isso em Python?

Respostas:

13 para resposta № 1

Em Python 3, map retorna um iterador, não uma lista. Você ainda tem que iterar sobre isso, seja chamando list explicitamente, ou colocando-o em um for loop. Mas você não deveria usar map assim mesmo assim. map é realmente para coletar valores de retorno em um iterável ou seqüência. Já que nenhum dos dois print nem set.update retorna um valor usando map neste caso, não é idiomático.

Seu objetivo é colocar todas as chaves em todos os contadores counters em um único conjunto. Uma maneira de fazer isso é usar uma expressão geradora aninhada:

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

Há também a adorável sintaxe de compreensão de dict, que está disponível no Python 2.7 e superior (obrigado Lattyware!) E pode gerar conjuntos e dicionários:

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

Estes são aproximadamente equivalentes ao seguinte:

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

0 para resposta № 2

Você quer a união de todos os valores de counters? Ou seja,

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

? Isso é só functools.reduce:

import functools

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


E se counters.values() aren "t já define (por exemplo, se eles" re listas ", então você deve transformá-los em conjuntos primeiro. Você pode fazer isso usando um compreensão de dit usando iteritems, que é um pouco desajeitado:

>>> 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, claro, você pode fazer isso inline, desde que você não se preocupa com 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])