#python #list #sorting #dictionary
#python #Список #сортировка #словарь
Вопрос:
def sortProfiles(p):
return sorted(p, key=itemgetter('first_name'))
У меня есть список со словарями. Эта функция позволяет мне сортировать их по их first_name . Однако она чувствительна к регистру.
Комментарии:
1. Все четыре ответа, за которые проголосовали, практически идентичны: D
Ответ №1:
>>> from operator import itemgetter
>>> p = [{'fn':'bill'}, {'fn':'Bob'}, {'fn':'bobby'}]
>>> sorted(p, key=itemgetter('fn'))
[{'fn': 'Bob'}, {'fn': 'bill'}, {'fn': 'bobby'}]
>>> sorted(p, key=lambda x: x['fn'].lower())
[{'fn': 'bill'}, {'fn': 'Bob'}, {'fn': 'bobby'}]
>>>
Ответ №2:
Вот способ:
return sorted(p, key=lambda x: x['first_name'].lower())
Ответ №3:
Похоже, что вы хотите sorted(p, key=lambda d: d['first_name'].lower())
.
Ответ №4:
def sortProfiles(p):
return sorted(p, key=lambda el: el['first_name'].lower())
Ответ №5:
Если вам не нравится lambda
, вы можете использовать именованную функцию в качестве извлечения ключа, например:
def sortProfiles(p):
def lowerName(d):
return d['first_name'].lower()
return sorted(p, key=lowerName)
def
Оператор может появиться практически везде, где мог бы появиться другой оператор, в том числе в теле другой функции. В этом случае выбор между вложенным def
, a lambda
или отдельным def
вне sortProfiles
является в основном вопросом стиля, хотя последнее из них может обеспечить некоторый прирост производительности.
Комментарии:
1. @alex, да, мне это не нравится, хотя я иногда использую его для особо простых случаев.
def
превосходен в профилировании, отладке, простоте вставкиlogging
вызовов, четкости трассировок и общности (позволяет использовать инструкции, а не только выражения) —lambda
не имеет компенсирующих конкретных преимуществ, просто избавляет вас от необходимости придумывать имя;-).
Ответ №6:
>>> def my_itemgetter(attr):
def get_attr(obj):
return obj.get(attr, "").lower()
return get_attr
>>> a= [{"a":"dA"},{"a":"ab"},{"a":"Ac"},{"a":"aa"}]
>>> sorted(a, key=my_itemgetter("a"))
[{'a': 'aa'}, {'a': 'ab'}, {'a': 'Ac'}, {'a': 'dA'}]
Комментарии:
1. Это чрезмерно усложняет решение. Кроме того,
my_itemgetter
следует назвать лучше.2. хотите исправить свой отступ?
3. @Mike: он не должен копировать какой-либо фрагмент ни с какого сайта. Это предназначено для того, чтобы он понимал, что необходимо, предоставляя при этом общее решение. Он может называть это как угодно. Не используя lambda, он может затем сделать
itemgetter
настолько сложным (пользовательским?), насколько захочет.4. Фрагменты кода, которые мы предлагаем для обучения людей, должны быть хороши во всех отношениях, хотя я признаю, что замечание о названии было довольно педантичным. В любом случае, это показалось немного более сложным, чем необходимо для решения, использующего либо
lambda
, либоdef
. Это также позволяет передавать ошибки беззвучно.