如何将函数应用于列表的元素?

时间:2012-05-11 15:36:16

标签: python list map python-2.7

我想将一个函数应用于列表中的所有元素,但我想实际更改元素(对象),而不是查看结果。我认为这是使用map()或列表推导的问题。

class Thing(object):
    pass

# some collection of things
my_things

# they are all big...

# produces SyntaxError: invalid syntax
[i.size = "big" for i in my_things]

# produces SyntaxError: lambda cannot contain assignment
map(lambda i: i.size="big", [i for i in my_things]) 

# no error, but is it the preferred way?
for i in my_things:
    i.size="big"

这样做的方法是什么?

5 个答案:

答案 0 :(得分:15)

出了什么问题
for i in my_things:
    i.size = "big"

您不希望既不使用map也不使用列表comprehansion,因为它们实际上会创建新列表。你不需要那么高昂的费用吗?

答案 1 :(得分:11)

虽然我同意

没有任何问题
for i in my_things:
    i.size = "big"
有些人热衷于python one-liners。 ;)

一个选项是在类中添加一个set方法,然后可以从lambda中调用它(基本上将赋值隐藏在函数中):

class Thing(object):
    def setSize(self, size):
        self.size = size

map(lambda i: i.setSize("big"), my_things) 

答案 2 :(得分:2)

您可以使用__setattr__方法在列表推导中分配属性。虽然,根据一些SO线程,使用列表推导而不使用输出不是pythonic。

[i.__setattr__('size', 'big') for i in my_things]

答案 3 :(得分:1)

  

我认为这是使用map()或列表推导的问题。

不完全。

my_things[:] = map(...)

答案 4 :(得分:0)

在python3上可能是这样的:

[dict(**i.__dict__, size='big') for i in my_things]

map(lambda x: dict(**x.__dict__, size='big'), my_things)

如果我是dict not object

[dict(**i, size='big') for i in my_things]

on python2

[dict(i.copy(), size='big') for i in my_things]  # isinstance(i, dict)
[dict(i.__dict__.copy(), size='big') for i in my_things]  # isinstance(i, object)