рд╕реЙрд░реНрдЯреНрд╕: рдХреБрдВрдЬреА рдмрдирд╛рдо рд╕реАрдПрдордкреА

рдЬрдм рдкрд╛рдпрдерди 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)) `рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред

Source: https://habr.com/ru/post/In138625/


All Articles