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 1W 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])