Как мне сделать эту сортировку нечувствительной к регистру?

#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 . Это также позволяет передавать ошибки беззвучно.