Значения слова Python map ()

Я пытаюсь использовать map() dict_values объекта dict_values возвращаемого функцией values() в словаре. Тем не менее, я не могу представить map() над dict_values :

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

Я уверен, что есть простой способ сделать это. То, что я на самом деле пытаюсь сделать, это создать set() всех ключей Counter в словаре Counters , что-то вроде этого:

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

Есть ли лучший способ сделать это в Python?

2 Solutions collect form web for “Значения слова Python map ()”

В Python 3 map возвращает итератор, а не список. Вам все равно придется перебирать его, либо вызывая list на нем явно, либо помещая его в цикл for . Но вы все равно не должны использовать map . map действительно для сбора возвращаемых значений в итерируемую последовательность. Поскольку ни print ни set.update возвращают значение, использование map в этом случае не является идиоматическим.

Ваша цель – поместить все ключи во все счетчики в counters в один набор. Один из способов сделать это – использовать вложенное выражение генератора:

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

Существует также прекрасный синтаксис понимания речи, который доступен в Python 2.7 и выше (спасибо Lattyware!) И может генерировать наборы, а также словари:

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

Они примерно эквивалентны следующему:

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

Вы хотите установить объединение всех значений counters ? То есть,

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

? Это просто functools.reduce :

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

Если counters.values() уже не заданы (например, если они являются списками), тогда вы должны сначала перенести их в набор. Вы можете сделать это, используя понимание dict, используя iteritems , который немного неуклюжим:

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

или, конечно же, вы можете сделать это inline, так как вы не заботитесь о 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]) 
  • Почему поиск в словаре намного быстрее, чем два if-теста в Python?
  • KeyError при попытке получить доступ к значению ключа из вложенного Manager.dict
  • Рекурсивная глубина словаря python
  • Самый эффективный способ поиска в списке dicts
  • возвращает выход словаря в алфавитном порядке
  • Как установить начальный размер словаря в Python?
  • Python: поиск ключа (строки) в словаре, который содержит подстроку
  • Как расширить строку внутри строки в python?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.