/ / Python map () wartości słownika - python, słownik, lambda

Wartości słownika map Python () - python, słownik, lambda

Próbuję użyć map() na dict_values obiekt zwrócony przez values() funkcja w słowniku. Jednak nie mogę map() ponad dict_values:

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

„Jestem pewien, że istnieje prosty sposób, aby to zrobić. W rzeczywistości staram się stworzyć set() ze wszystkich Counter klucze w słowniku Counters, robiąc coś takiego:

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

Czy jest lepszy sposób na zrobienie tego w Pythonie?

Odpowiedzi:

13 dla odpowiedzi nr 1

W Pythonie 3, map zwraca iterator, a nie listę. Nadal musisz iterować, albo dzwoniąc list na nim wyraźnie, lub umieszczając go w for pętla. Ale nie powinieneś używać map tak i tak. map jest naprawdę do zbierania wartości zwracanych do powtarzalnej lub sekwencji. Od żadnego z nich print ani set.update zwraca wartość, używając map w tym przypadku nie jest idiomatyczne.

Twoim celem jest umieszczenie wszystkich kluczy we wszystkich licznikach counters w pojedynczy zestaw. Jednym ze sposobów jest użycie zagnieżdżonego wyrażenia generatora:

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

Istnieje również urocza składnia rozumienia dyktatu, która jest dostępna w Pythonie 2.7 i nowszych (dzięki Lattyware!) I może generować zestawy oraz słowniki:

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

Oba są mniej więcej równoważne następującym:

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

0 dla odpowiedzi nr 2

Chcesz zestawienie wszystkich wartości counters? To znaczy.,

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

? To jest tylko functools.reduce:

import functools

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


Gdyby counters.values() nie są już ustawione (np. jeśli „re listują”), powinieneś najpierw zmienić je na zestawy. Możesz to zrobić za pomocą dyktuj zrozumienie za pomocą iteritems, który jest trochę niezgrabny:

>>> 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])}

lub oczywiście możesz to zrobić bezpośrednio, ponieważ nie zależy ci na tym 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])