Python:合并排序键函数 itemgetter 和 str.lower
我想要根据字典的键来排序一个字典列表,但我不想区分大小写。
dict1 = {'name':'peter','phone':'12355'}
dict2 = {'name':'Paul','phone':'545435'}
dict3 = {'name':'klaus','phone':'55345'}
dict4 = {'name':'Krishna','phone':'12345'}
dict5 = {'name':'Ali','phone':'53453'}
dict6 = {'name':'Hans','phone':'765756'}
list_of_dicts = [dict1,dict2,dict3,dict4,dict5,dict6]
key_field = 'name'
list_of_dicts.sort(key=itemgetter(key_field))
# how to combine key=itemgetter(key_field) and key=str.lower?
for list_field in list_of_dicts:
print list_field[key_field]
应该提供
Ali, Hans, klaus, Krishna, Paul, peter
而不是
klaus, peter, Ali, Hans, Krishna, Paul
7 个回答
5
在编程中,有时候我们会遇到一些问题,尤其是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该如何解决。比如,有人可能在使用某个特定的功能时,发现它并没有按照预期的方式工作。这种情况很常见,尤其是对于刚开始学习编程的人来说。
当我们遇到这样的情况时,首先要做的就是仔细检查我们的代码,看看是否有拼写错误或者逻辑上的问题。很多时候,问题可能只是一个小小的错误导致的。
如果自己检查后还是找不到问题所在,可以考虑去网上查找相关的资料或者向其他人请教。像StackOverflow这样的社区就是一个很好的地方,那里有很多经验丰富的程序员,他们乐于帮助别人解决问题。
总之,遇到问题时不要着急,慢慢分析,寻找解决方案,最终你会找到答案的。
from functools import partial
def nested_funcs(*funcs):
return partial(reduce, lambda arg, func: func(arg), funcs)
sorted(list_of_dicts, key=nested_funcs(itemgetter('name'), str.strip, str.lower))
16
这样怎么样:
list_of_dicts.sort(key=lambda a: a['name'].lower())
13
一般来说,你需要为排序写一个提取关键字的函数;只有在一些特殊但重要的情况下,你才能直接使用现有的可调用对象来提取关键字,或者简单地把几个现有的函数组合起来(用lambda
这种快速而简单的方法,因为没有内置的函数组合方式)。
如果你经常需要进行这两种关键字提取操作(获取一个项目并对该项目调用一个方法),我建议你:
def combiner(itemkey, methodname, *a, **k):
def keyextractor(container):
item = container[itemkey]
method = getattr(item, methodname)
return method(*a, **k)
return keyextractor
这样listofdicts.sort(key=combiner('name', 'lower'))
在你的情况下就能正常工作。
需要注意的是,虽然过度的泛化会带来一些问题,但适度的泛化(在运行时决定项目关键字、方法名称和方法参数,如果有的话)通常是有好处的——一个通用的函数,不会比十几个特定的、专业的函数更复杂(这些函数的提取器、要调用的方法,或者两者都是硬编码在代码里的),这样更容易维护(当然,也更容易重复使用!)。