映射/迭代Python对象列表

时间:2012-09-07 22:42:40

标签: python map itertools functools

有没有办法在具有多个属性的用户定义的Python对象列表上迭代并调用函数?我们假设它叫做Entry,带有属性名称和年龄。

这样我可以说出

的效果
def func(name, age):
    //do something

def start(list_of_entries)
    map(func, list_of_entries.name(), list_of_entries.age()) 
    //but obviously the .name and .age of the object, not the iterable
    //these are the only two attributes of the class

考虑使用functools.partial()但不确定在这种情况下是否有效。

3 个答案:

答案 0 :(得分:7)

我想你可以使用lambda函数:

>>> def start(list_of_entries):
...     map((lambda x:func(x.name,x.age)), list_of_entries)

但为什么不使用循环?:

>>> def start(list_of_entries):
...     for x in list_of_entries: func(x.name, x.age)

或者如果你需要func的结果:

>>> def start(list_of_entries):
...     return [func(x.name, x.age) for x in list_of_entries]

答案 1 :(得分:0)

您可以使用operator.attrgetter()来指定多个属性,但明确的列表理解更好:

results = [f(e.name, e.age) for e in entries]

答案 2 :(得分:0)

如果名称和年龄是唯一的两个属性,您可以使用变量。否则,将** kwargs添加到你的func并忽略其余的。

def func(name, age, **kwargs):
    //do something with name and age


def start(list_of_entry):
    map(lambda e: func(**vars(e)), list_of_entry)