Как сделать сортировку без учета регистра? - PullRequest
2 голосов
/ 10 марта 2010
def sortProfiles(p):
    return sorted(p, key=itemgetter('first_name'))

У меня есть список со словарями. Эта функция позволяет мне сортировать их по имени. Тем не менее, он чувствителен к регистру.

Ответы [ 6 ]

8 голосов
/ 10 марта 2010
>>> 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 голосов
/ 10 марта 2010

Вот способ:

return sorted(p, key=lambda x: x['first_name'].lower())
1 голос
/ 10 марта 2010

Если вам не нравится lambda, вы можете использовать именованную функцию в качестве экстрактора ключей, например:

def sortProfiles(p):
    def lowerName(d):
        return d['first_name'].lower()
    return sorted(p, key=lowerName)

Оператор def может появляться практически везде, где мог бы другой оператор, в том числе в теле другой функции. В этом случае выбор между вложенным def, lambda или отдельным def за пределами sortProfiles в основном зависит от стиля, хотя последний из них может обеспечить некоторое повышение производительности. *

1 голос
/ 10 марта 2010
def sortProfiles(p):
    return sorted(p, key=lambda el: el['first_name'].lower())
1 голос
/ 10 марта 2010
>>> 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 голос
/ 10 марта 2010

Похоже, вы хотите sorted(p, key=lambda d: d['first_name'].lower()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...