使用其他问题的第二个答案,一般化以支持任何作为获取键基础的项目方法:
import re
from operator import itemgetter
def sorted_nicely(l, key):
""" Sort the given iterable in the way that humans expect."""
convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda item: [ convert(c) for c in re.split('([0-9]+)', key(item)) ]
return sorted(l, key = alphanum_key)
print sorted_nicely([('b10', 0), ('0', 1), ('b9', 2)], itemgetter(0))
这与那个答案完全相同,只是泛化为使用
任何可调用对象作为对项的操作。如果您只想在字符串上执行此操作,可以使用
lambda item: item
;如果您想在列表、元组、字典或集合上执行此操作,可以使用
operator.itemgetter(key_or_index_you_want)
;如果您想在类实例上执行此操作,则可以使用
operator.attrgetter('attribute_name_you_want')
。
它会返回:
[('0', 1), ('b9', 2), ('b10', 0)]
针对你的第二个例子。
sorted()
,并且与那个函数完全相同(除了它返回一个生成器而不是列表)。 - Kirk Strausersorted
无论输入是迭代器、元组或生成器表达式,都会返回一个列表。 - JBernardo