Ответ 1
И что не так с
for i in my_things:
i.size = "big"
Вы не хотите использовать ни map
, ни список comprehansion, потому что они фактически создают новые списки. И вам не нужно это накладные расходы, не так ли?
Я хочу применить функцию ко всем элементам в списке, но я хочу фактически изменить элементы (объекты), а не просматривать результаты. Я думаю, что это проблема с использованием методов 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"
Каков способ сделать это?
И что не так с
for i in my_things:
i.size = "big"
Вы не хотите использовать ни map
, ни список comprehansion, потому что они фактически создают новые списки. И вам не нужно это накладные расходы, не так ли?
Пока я согласен, что нет ничего плохого в
for i in my_things:
i.size = "big"
некоторые люди горят в однострочном пространстве python.;)
Один из вариантов - добавить метод set к вашему классу, который затем может быть вызван из лямбда (по существу, скрывает назначение в функции):
class Thing(object):
def setSize(self, size):
self.size = size
map(lambda i: i.setSize("big"), my_things)
Я думаю, что это проблема с использованием соображений map() или списка.
Не совсем.
my_things[:] = map(...)
Вы можете использовать метод __setattr__
для назначения атрибута в понимании списка. Хотя, согласно некоторым SO-потокам, использование списков без использования вывода не является питоновым.
[i.__setattr__('size', 'big') for i in my_things]
может быть так на python3:
[dict(**i.__dict__, size='big') for i in my_things]
или
map(lambda x: dict(**x.__dict__, size='big'), my_things)
если я - это не объект
[dict(**i, size='big') for i in my_things]
на 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)