Python map()字典值

Taj*_*ton 6 python lambda dictionary

我正在尝试在字典上使用函数返回map()dict_values对象values().但是,我似乎无法map()超越dict_values:

map(print, h.values())
Out[31]: <builtins.map at 0x1ce1290>
Run Code Online (Sandbox Code Playgroud)

我确信有一个简单的方法可以做到这一点.我实际上要做的是在字典中创建set()所有CounterCounters,执行以下操作:

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

有没有更好的方法在Python中执行此操作?

sen*_*rle 14

在Python 3中,map返回一个迭代器,而不是一个列表.您仍然必须通过list显式调用它或将其置于for循环中来迭代它.但map无论如何你不应该使用这种方式.map实际上是将返回值收集到迭代或序列中.既然也print没有set.update返回值,map在这种情况下使用不是惯用的.

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

s = set(key for counter in counters.values() for key in counter)
Run Code Online (Sandbox Code Playgroud)

还有可爱的dict理解语法,可以在Python 2.7及更高版本中使用(感谢Lattyware!),并且可以生成集合和字典:

s = {key for counter in counters.values() for key in counter}
Run Code Online (Sandbox Code Playgroud)

这些都大致相当于以下内容:

s = set()
for counter in counters.values():
    for key in counter:
        s.add(key)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这里稍微更清晰的选项是简单地使用集合理解而不是生成器构造函数中的生成器表达式 - `{counter for counter.values()中的计数器用于计数器中的键}. (2认同)