Использование второго ответа из другого вопроса, обобщенного для поддержки любого метода элемента, в качестве основы для получения ключа:
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)]
для вашего примера # 2.