2012-03-15 4 views
0

У меня есть этот список словарей:Python: функции для извлечения данных всегда возвращает None

cust = [ 
     {"id": 1, "name": u"name 1", "bill_amount": 1000}, 
     {"id": 2, "name": u"name 2", "bill_amount": 5000}, 
     {"id": 3, "name": u"name 3", "bill_amount": 7600}, 
     {"id": 4, "name": u"name 4", "bill_amount": 30} 
     ] 

И я хочу, чтобы получить список только имена.

Попытка это:

def getName(x): x["name"] 
print map(getName, cust) 

возвращает это:

[None, None, None, None] 

Почему? Мне что-то не хватает?

ответ

3
def getName(x): 
    return x["name"] 

В python функция, которая ничего не возвращает, возвращает None. Не следует путать это с лямбда-синтаксисом (полезно, но не «вещий»), который был бы: getName = lambda x: x["name"]

+0

О, хорошо, я думал, что это похоже на рубин, и последнее выражение возвращается. Спасибо – emzero

+2

Кстати, почему лямбды не считаются «пифоническими»? – emzero

+0

в соответствии с Guido: «Мне никогда не нравился лямбда - искалеченный (только одно выражение) - запутанный (без круглых скобок аргументов) - может вместо этого использовать локальную функцию« – wim

6

Вы также можете использовать operator.itemgetter() вместо определения собственную функцию для этого:

>>> import operator 
>>> map(operator.itemgetter("name"), cust) 
[u'name 1', u'name 2', u'name 3', u'name 4'] 
+0

+1 Очень чистый способ достижения этого без необходимости писать дополнительный код. – Tadeck

3

Как уже что ваша функция ничего не возвращает.

Для записи питонический способ сделать это не использовать map, но использовать понимание списка.

[d['name'] for d in cust] 
+0

Я считаю, что это спорно (использование 'карт()' против списочные) и зависит ли функция, которую вы хотите применить уже определена или нет. Во всяком случае +1 для другого варианта. – Tadeck

+0

У меня нет проблем с 'map()' лично, но Гвидо говорит, что «понимание списков делает то же самое лучше». источник: слайд 4 из [python regrets] (http://www.python.org/doc/essays/ppt/regrets/PythonRegrets.pdf) – wim

+0

Я считаю, что некоторые вещи изменились с 2002 года, и даже если 'reduce()' имеет был удален из встроенных в 3.x, 'map()' остается и [иногда даже более эффективен] (http://stackoverflow.com/a/1247490/548696) (и более чистый, но это довольно субъективно). – Tadeck

Смежные вопросы