Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.14.83.223] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток!
Вот к примеру код, на Python 2.7 работает, а в Python 3.7 нет persons = [('Gregory', 42), ('Julia', 27)] print([age for name, age in persons]) # OK Генератор списка в любой версии print(map(lambda (name, age): age, persons)) # OK в Python 2.7 print(list(map(lambda name, age: age, persons))) # Python 3.7 # ^^^ TypeError: <lambda>() missing 1 required positional argument: 'age' Как исправить? |
Сообщ.
#2
,
|
|
|
Ну, можно так на край
print(list(map(lambda item: item[1], persons))) |
Сообщ.
#3
,
|
|
|
В Python 3.x лучше пользоваться не map'ом, а генератором списка, работающим и в ранних версиях.
А не работает, поскольку в Python 3.x решили сделать синтаксис объявления функций более строгим. А задачу можно решить и так from itertools import starmap print(list(starmap(lambda name, age: age, persons))) from operator import itemgetter print(list(map(itemgetter(1), persons))) from collections import namedtuple Person = namedtuple('name age') persons = [Person('Gregory', 42), Person('Julia', 27)] from operator import attrgetter print(list(map(attrgetter('age'), persons))) Но, повторю, в данной ситуации это не слишком хорошие решения, даже если результат "маппирования" передаётся итератором куда-то, а не конвертится в список. map и starmap имеет смысл использовать для вызова "тяжёлых" функций. |
Сообщ.
#4
,
|
|
|
Спасибо Друзья! Это работает!
А вот мое гениальное решение def get_person_attr(attr): return { 'name': lambda person: person[0], 'age': lambda person: person[1], }[attr] print(list(map(get_person_attr('age'), persons))) # Any Python Цитата amk @ В Python 3.x лучше пользоваться не map'ом, а генератором списка, работающим и в ранних версиях. как правило его и юзаю Цитата amk @ Но, повторю, в данной ситуации это не слишком хорошие решения, даже если результат "маппирования" передаётся итератором куда-то, а не конвертится в список. map и starmap имеет смысл использовать для вызова "тяжёлых" функций. из-за производительности? |
Сообщ.
#5
,
|
|
|
Цитата Cfon @ Из-за этого тоже, но больше из-за ухудшения читаемости.из-за производительности? Map с лямбдой воспринимается не так хорошо, как генератор. А с именем функции и переменной воспринимается нормально. |