关于使用python中的列表过滤字典的问题

时间:2011-04-03 23:11:42

标签: python

使用以下字典和数组:

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)是否有优势?或者更好的是有更好的方法吗?

3 个答案:

答案 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)