python:组合sort-key-functions itemgetter和str.lower

Sim*_*man 7 python sorting key function

我想按字典键对字典列表进行排序,我不想区分大写和小写字符.

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]
Run Code Online (Sandbox Code Playgroud)

应该提供

Ali, Hans, klaus, Krishna, Paul, peter
Run Code Online (Sandbox Code Playgroud)

并不是

klaus, peter, Ali, Hans, Krishna, Paul
Run Code Online (Sandbox Code Playgroud)

Nad*_*mli 14

这个怎么样:

list_of_dicts.sort(key=lambda a: a['name'].lower())
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 10

在一般情况下,您需要编写密钥提取功能以进行排序; 只有在特殊的(虽然重要的)情况下,您可以重复使用现有的可调用来为您提取密钥,或者只是将几个现有的密码连接起来(以"快速和脏"的方式使用lambda,因为没有内置的做功能组合的方法).

如果您经常需要执行这两种操作来进行密钥提取(获取项目并在该项目上调用方法),我建议:

def combiner(itemkey, methodname, *a, **k):
  def keyextractor(container):
    item = container[itemkey]
    method = getattr(item, methodname)
    return method(*a, **k)
  return keyextractor
Run Code Online (Sandbox Code Playgroud)

所以listofdicts.sort(key=combiner('name', 'lower'))将适用于您的情况.

请注意,虽然过度泛化具有成本,但有品味和适度的泛化(留下项密钥,方法名称和方法参数,如果有的话,在这种情况下作为运行时确定的)通常具有好处 - 一个通用功能,不比一个更复杂十几个特定的​​和专门的(使用提取器,调用方法或两者,在他们的代码中硬连线),将更容易维护(当然,更容易重用! - ).


Ale*_*x K 5

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))
Run Code Online (Sandbox Code Playgroud)