рдЬрдм рдкрд╛рдпрдерди 2 рдореЗрдВ рдЫрдБрдЯрд╛рдИ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕ рдЫрдБрдЯрд╛рдИ рдХреЛ "рдХреЙрдиреНрдлрд╝рд┐рдЧрд░" рдХрд░рдиреЗ рдХреЗ рдХрдо рд╕реЗ рдХрдо рджреЛ рддрд░реАрдХреЗ рд╣реЛрддреЗ рд╣реИрдВ: рдпреЗ
key
рдФрд░
cmp
рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред рдкрд╣рд▓рд╛ рдХреЗрд╡рд▓ рдкрд╛рдпрдерди 2.4 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рджреВрд╕рд░рд╛ рдкрд╛рдпрдерди 3.0 рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрди рддрдереНрдпреЛрдВ рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
key
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИред рдХреМрди рдЗрд╕рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реИ рдпрд╛ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ - рдореИрдВ рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реВрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдереЛрдбрд╝рд╛ рднреНрд░рдордг рддрд╛рдХрд┐ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЧрдбрд╝рдмрдбрд╝ рди рджрд┐рдЦреЗред
рдкрд╛рдпрдерди рдЖрдорддреМрд░ рдкрд░ рдЫрдБрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП рдпрд╛ рддреЛ рдмрд┐рд▓реНрдЯ-рдЗрди `рд╕реЙрд░реНрдЯреЗрдб` рдпрд╛` рд▓рд┐рд╕реНрдЯ.рд╢реЙрд░реНрдЯ` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЙрд▓ рдХрд░реЗрдВ
sorted(iterable, **kwargs)
рдХреЛрдб рдХреЗ
рдмрд░рд╛рдмрд░ lst = list(iterable); lst.sort(**kwargs); lst
рдЗрд╕рд▓рд┐рдП рд╣рдо `рд╕реВрдЪреА.рд╢реЙрд░реНрдЯ` рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред
`list.sort` рддреАрди рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ:` key` рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рднреА рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ) рд╣реИ рдЬреЛ рдПрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рдмрдЬрд╛рдп рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; `cmp` рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╕реВрдЪреА рдХреЗ рджреЛ рддрддреНрд╡реЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреЗ рдЖрдзрд╛рд░ рдкрд░ -1, 0, рдпрд╛ 1 рджреЗрддрд╛ рд╣реИ; `рдЙрд▓рдЯ` - рдЕрдЧрд░` рд╕рдЪ`, рддреЛ рд╕реВрдЪреА рдХреЛ рдЙрд▓реНрдЯреЗ рдХреНрд░рдо рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рддреЛ, рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ `рдЖрдИрдбреА` рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реВрдЪреА рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЖрдЗрдП `cmp` рдФрд░` key` рджреГрд╖реНрдЯрд┐рдХреЛрдг рджреЗрдЦреЗрдВ:
lst.sort(cmp=lambda x, y: cmp(x['id'], y['id']))
lst.sort(key=lambda x: x['id'])
рдпрд╣ рдЧрддрд┐ рдХреА рдХреАрдордд рдкрд░ рдирд┐рд░рд╛рдзрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдкрд░реАрдХреНрд╖рдг рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ:
>>> lst = [{'id': x, 'name': 'test'} for x in xrange(1000)] >>> random.shuffle(lst) >>> def with_cmp(lst): ... lst.sort(cmp=lambda x, y: cmp(x['id'], y['id'])) ... >>> def with_key(lst): ... lst.sort(key=lambda x: x['id']) ... >>> timeit.timeit('with_cmp(lst[:])', setup='from __main__ import with_cmp, lst', number=1000) 2.7731389999389648 >>> timeit.timeit('with_key(lst[:])', setup='from __main__ import with_key, lst', number=1000) 0.55310797691345215
рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рдХреНрдпреЛрдВ рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ `рдХреА` рдкреИрд░рд╛рдореАрдЯрд░ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рд╕реВрдЪреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЫрдВрдЯрд╛рдИ (
рд╕реЙрд░реНрдЯ ) рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЬрдмрдХрд┐` рд╕реАрдПрдордкреА` рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддреНрдпреЗрдХ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ! рдкрд╛рдпрдерди рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдЯреАрдо рд╕реЙрд░реНрдЯ (
рдПрд▓реНрдЧреЛрд░рд┐рдердо рдкрд╛рд░реНрд╕рд┐рдВрдЧ ) рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдиреЙрдЧрд▓ (рдПрди) рдХреА рдФрд╕рдд рд░реЗрдЯрд┐рдВрдЧ рд╣реИ, рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, `рд╕реАрдПрдордкреА` рд╕реЗ рд▓рдВрдмреЛрджрд░ рдХреЛ рдХрдИ рдмрд╛рд░ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдЗрд╕реЗ рдФрд░ рднреА рддреЗрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдкрд╛рдпрдерди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдореВрд▓ рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рдСрдкрд░реЗрдЯрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдпрд╣рд╛рдВ рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ рдХрд┐
рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛
рджрд┐рдЦреЗрдВрдЧреЗ ред
itemgetter (рдЕрднреА рднреА
docs.python.org/library/operator.html#operator.attrgetter ,
methodcalled рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд╣реИрдВ):
>>> from operator import itemgetter >>> def with_op(lst): ... lst.sort(key=itemgetter('id')) ... >>> timeit.timeit('with_op(lst[:])', setup='from __main__ import with_op, lst, itemgetter', number=1000) 0.4054520057716877
рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрд▓,
20 7x рдЧрддрд┐ рдХреА рд╡реГрджреНрдзрд┐ - рдЦрд░рд╛рдм рдирд╣реАрдВ, рд╕рд╣реА?
рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЧрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдордЭрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ `рдХреА` \ _ cmp` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реНрд╡рд╛рдж рдХрд╛ рд╡рд┐рд╖рдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдж рдореЗрдВ
рдмрд╣рдиреЗ рд╡рд╛рд▓реА рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЙрджрд╛рд╣рд░рдг
рд╣реИ ред рд╕рдм рдХреБрдЫ рддрдм рддрдХ рдареАрдХ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд `cmp` рдХрд╛ рдЙрдкрдпреЛрдЧ` cmp` рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЫрдБрдЯрд╛рдИ рддрдВрддреНрд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЖрдкрд╕реЗ рдирд┐рдореНрди рдХреЛрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рддреЛ рдЖрдк рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ:
>>> def numeric_compare(x, y): return x - y >>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╛рдж рд╣реИ рдХрд┐ `cmp` рдХреЛ -1, 0, рдпрд╛ 1 рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛? рдпрджрд┐ `x`` y` рд╕реЗ рдмрдбрд╝рд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдпрд╣ 1 рдпрд╛ -1 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрджрд┐ рдЖрдк 2 рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА рдпрд╛ 2 рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ 1 рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рдПрдЧреА? рдмреЗрд╢рдХ, рдЖрдк рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдЖрдзреЗ рдорд┐рдирдЯ рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ рджреЗрдЦреЗрдВ? рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдмреЗрд╣рддрд░ рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЕрд░реНрдерд╛рдд, 'рдХреА' рдкреИрд░рд╛рдореАрдЯрд░ред
рд╕рд╡рд╛рд▓реЛрдВ рдХреА рдЪреЗрддрд╛рд╡рдиреА рджреЗрддреЗ рд╣реБрдП, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╢рд╛рдпрдж рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рджреБрд░реНрд▓рдн рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд╣рд╛рдВ `рдХреА` рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпреЗ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рднреА рд╡реНрдпрдВрдЬрдиреЛрдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╣реИ
рд╕реЙрд░реНрдЯ рдорд┐рдиреА-рд╣рд╛рдЙ рдЯреВ: cmp_to_key )ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдкреБрдирд╢реНрдЪ рдЪреБрдиреМрддреАред рдирд┐рдореНрди рдХреЛрдб рдХреНрдпреЛрдВ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ:
>>> ls = [(1,2,3), (2,1,3), (2,3,1)] >>> ls.sort(key=reversed) >>> ls [(1, 2, 3), (2, 3, 1), (2, 1, 3)] >>> ls.sort(key=reversed) >>> ls [(2, 1, 3), (1, 2, 3), (2, 3, 1)]
рдЙрддреНрддрд░ рд╣реИ:
`рдЙрд▓рдЯрд╛` рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ` <рдкреНрд░рдХрд╛рд░ 'рдЙрд▓рдЯ'> `, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдореГрджреНрдз-рд╕рдВрдЧрддрд┐ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, `list.sort` рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП` id` рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВред `рдЙрд▓рдЯ` рдХреЗ рдмрдЬрд╛рдп` рдСрдкрд░реЗрдЯрд░.рдорд┐рдЯреЗрдореЗрдЯрд░ (рд╕реНрд▓рд╛рдЗрд╕ (рдХреЛрдИ рдирд╣реАрдВ, рдХреЛрдИ рдирд╣реАрдВ, -1)) `рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред