使用以下字典和数组:
a = { 'a':[1,2,3,4,5], 'b':[1,2,3], 'c':[1,2,3,4,5] } b = ['a','c']
我想过滤一个新的字典,只有数组b中的键值,所以我最终得到:
c = {'a': [1, 2, 3, 4, 5], 'c': [1, 2, 3, 4, 5]}
所以......对我来说这个显而易见的方法如下:
(1) dict(map( lambda x:(x,a[x]), b))
寻找不同的方法我也看到了:
(2) dict( (x, a[x]) for x in b)
我没有完全理解(2)但是在我深入了解正在发生的事情之前使用(2)超过(1)是否有优势?或者更好的是有更好的方法吗?
答案 0 :(得分:4)
内置map()
始终可以由列表推导替代。电话
map(callable, iterable)
相当于
[callable(x) for x in iterable]
如果callable
是一个lambda表达式,后一种形式更快,更易读,这就是为什么在这种情况下更喜欢它。
如果你真的不需要map()
返回的列表,而只需要另一个“iterable”,你也可以用生成器表达式替换map()
调用
(callable(x) for x in iterable)
这不会立即创建所有项目。只有在迭代生成器时才会逐个创建项目。
在您的示例中,dict
构造函数只需要一个iterable,它将迭代插入所有项目直接进入新的dict
实例。您不需要列表理解或对map()
的调用会创建的中间列表。
你的选项(2)比(1)快,使用更少的内存,更简洁,(在我看来)比(1)更具可读性。
答案 1 :(得分:2)
使用python 2.7和3.0语法:
{ k:a[k] for k in b }
答案 2 :(得分:0)
(2)的优点是它使用生成器来生成键值元组,因此可以避免lambda x() N方法调用的开销>(1)强>