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. ?

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

4

3 回答 3

7

当然,你可以用函数来做到这一点。您可以使用filter 内置函数

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

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

new_list = [foo for foo in foos if foo.location == 2]
于 2012-12-25T19:29:33.310 回答
6

列表理解似乎是您想要使用的:

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

map当您想将函数应用于列表(或任何可迭代)中的每个项目并获得等长列表(或 Python3 中的迭代器)作为结果时,这是很好的。它不能基于某些条件“跳过”项目。

于 2012-12-25T19:29:20.047 回答
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}]

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

于 2013-01-02T09:21:58.980 回答