如何使这个排序区不敏感?

时间:2010-03-10 02:58:29

标签: python list sorting dictionary

def sortProfiles(p):
    return sorted(p, key=itemgetter('first_name'))

我有一个包含词典的列表。此函数允许我按first_name对它们进行排序。但是,它区分大小写。

6 个答案:

答案 0 :(得分:8)

>>> 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'}]
>>>

答案 1 :(得分:2)

这是一种方式:

return sorted(p, key=lambda x: x['first_name'].lower())

答案 2 :(得分:1)

看起来你想要sorted(p, key=lambda d: d['first_name'].lower())

答案 3 :(得分:1)

>>> 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'}]

答案 4 :(得分:1)

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

答案 5 :(得分:1)

如果你不喜欢lambda,你可以使用命名函数作为你的密钥提取器,例如:

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

def语句几乎可以出现在另一个语句的任何位置,包括在另一个函数的主体中。在这种情况下,嵌套的deflambdadef之外的sortProfiles之间的选择主要是风格问题,尽管最后一个可以提供一些性能提升。