如何在Python中比较映射两个列表

5

我有一个对象列表,比如说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. ?

我可以在这里使用map函数吗?如果可以,应该如何使用?
(请注意:保留了原始HTML标记。)
3个回答

7
当然可以使用函数来实现。您可以使用内置的 filter 函数:文档链接
new_list = filter(lambda foo: foo.location == 2, foos)

但更一般和“pythonic”的方法是使用列表推导式

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

6
列表推导式(List comprehension)似乎是你需要使用的内容:
new_list = [foo for foo in foos if foo.location == 2]

map函数适用于对列表中每个元素(或任何可迭代对象)应用一个函数,并以与原列表相同的长度(在Python3中返回一个迭代器)获得结果列表。它不能根据某些条件“跳过”元素。


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

希望这可能是出乎意料的...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接