Python:合并排序键函数 itemgetter 和 str.lower

9 投票
7 回答
6182 浏览
提问于 2025-04-15 14:09

我想要根据字典的键来排序一个字典列表,但我不想区分大小写。

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'))在你的情况下就能正常工作。

需要注意的是,虽然过度的泛化会带来一些问题,但适度的泛化(在运行时决定项目关键字、方法名称和方法参数,如果有的话)通常是有好处的——一个通用的函数,不会比十几个特定的、专业的函数更复杂(这些函数的提取器、要调用的方法,或者两者都是硬编码在代码里的),这样更容易维护(当然,也更容易重复使用!)。

撰写回答