Python map()字典值

时间:2012-05-21 20:54:36

标签: python dictionary lambda

我正在尝试在字典上map()函数返回的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 个答案:

答案 0 :(得分:13)

在Python 3中,map返回迭代器,而不是列表。您仍然必须通过显式调用list或将其放在for循环中来迭代它。但是你不应该以这种方式使用mapmap实际上是用于将返回值收集到迭代或序列中。由于printset.update都没有返回值,因此在这种情况下使用map不是惯用的。

您的目标是将counters中所有计数器中的所有密钥放入一个集合中。一种方法是使用嵌套的生成器表达式:

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

还有可爱的dict理解语法,可以在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)

答案 1 :(得分:0)

您想要counters的所有值的集合吗?即,

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

?那只是functools.reduce

import functools

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


如果counters.values()尚未设置(例如,如果它们是列表),则应首先将它们设置为集合。您可以使用dict comprehension使用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])}

当然你也可以内联,因为你不关心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])