如何映射2个列表与python中的比较

时间:2012-12-25 19:26:11

标签: python map

我有一个说foos的对象列表。 我有一个创建新列表的循环。

foo1 = {id:1,location:2}
例如foos = [foo1,foo2,foo3]

现在我想根据位置创建一个新列表。

new_list = []
for foo in foos:
  if foo.location==2:
      new_list.append(foo)

我想知道的是,有什么办法我可以做这样的事情

new_list = []
new_list = map(if foo.location ==2,foos) // this is wrong code but is something like this possible. ?

我可以在这里使用地图功能吗?如果是的话怎么样?

3 个答案:

答案 0 :(得分:7)

当然你可以用功能做到这一点。您可以使用filter builtin function

new_list = filter(lambda foo: foo.location == 2, foos)

但更普遍和“pythonic”的方式是使用list comprehensions

new_list = [foo for foo in foos if foo.location == 2]

答案 1 :(得分:6)

List comprehension似乎就是您想要使用的内容:

new_list = [foo for foo in foos if foo.location == 2]
当你想将一个函数应用于列表(或任何可迭代的)中的每个项并获得相等长度的列表时

map是好的em>(或Python3中的迭代器)作为结果。它不能根据某些条件“跳过”项目。

答案 2 :(得分:1)

你是否使用过滤器与lambda 功能绑定 例如,

a = {'x': 1, 'location': 1}
b = {'y': 2, 'location': 2}
c = {'z': 3, 'location': 2}
d=[a,b,c]

根据你的例子,d将是

d = [{'x': 1, 'location': 1}, {'y': 2, 'location': 2}, {'z': 3, 'location': 2}]
output = filter(lambda s:s['location']==2,d)'
print output'

结果应该是,

[{'y': 2, 'location': 2}, {'z': 3, 'location': 2}]

我希望这可能是你期待的......