2010-03-10 45 views
2
def sortProfiles(p): 
    return sorted(p, key=itemgetter('first_name')) 

我有一個詞典列表。這個功能允許我按他們的first_name對它們進行排序。但是,它是區分大小寫的。如何使此排序不區分大小寫?

+0

對這個問題的四個解決方案答案几乎完全相同:D – dimo414 2011-10-20 01:35:47

回答

7
>>> 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()) 
1

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

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

這太複雜瞭解決方案。另外,'my_itemgetter'應該命名得更好。 – 2010-03-10 03:13:33

+0

小心修理您的縮進? – 2010-03-10 03:14:02

+0

@Mike:他不應該複製任何網站的任何類型的片段。這是爲了讓他理解需要什麼,同時提供一個通用的解決方案。他可以隨心所欲地命名它。通過不使用lambda,他可以使'itemgetter'成爲他想要的複雜(自定義?)。 – voyager 2010-03-10 03:21:06

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

如果你不喜歡lambda,你可以使用一個名爲功能的關鍵提取,如:

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

def語句可以出現在任何地方另一份聲明中可能包括在另一個功能的身體。在這種情況下,嵌套deflambda或之外的單獨def之間的選擇主要是風格問題,儘管其中的最後一個可以提供一些性能增益。

+0

你不喜歡拉姆達? – TIMEX 2010-03-10 03:42:36

+1

@alex,是的,我不喜歡它,儘管有時我會用它來做特別簡單的事情。 ''def'優於profiling,調試,簡單插入'logging'調用,追溯的清晰度和通用性(允許使用語句,而不僅僅是表達式) - 'lambda'沒有補償的具體優點,只是節省了你從不必考慮一個名字;-)。 – 2010-03-10 03:56:38