8

我正在尝试在字典上的函数返回map()的对象上使用。但是,我似乎无法完成:dict_valuesvalues()map()dict_values

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

我确信有一个简单的方法可以做到这一点。我实际上想要做的是在字典中创建一个set()所有键,做这样的事情:CounterCounters

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

有没有更好的方法在 Python 中做到这一点?

4

2 回答 2

18

在 Python 3 中,map返回一个迭代器,而不是一个列表。list您仍然必须通过显式调用它或将其置于循环中来对其进行迭代formap但是无论如何你都不应该使用这种方式。map真正用于将返回值收集到可迭代或序列中。由于既不print也不set.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)
于 2012-05-21T21:03:43.367 回答
0

你想要所有值的集合并集counters?IE,

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

或者当然你可以内联,因为你不关心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])
于 2014-03-24T20:32:16.037 回答