Сортировка справки: сначала этим, и затем этим

Не все же, но я слышал, что следующая версия Живой Messenger, вероятно, будет WPF. Это может быть достойное внимания сразу сделано. Microsoft определенно должна добраться, больше их собственных приложений, обновленных до WPF к действительно ", продает ее".

5
задан thornomad 1 November 2009 в 14:15
поделиться

3 ответа

Пользовательские функции сравнения для сортировки, как предлагается в существующих ответах, действительно упрощают сортировку в сочетании по возрастанию и убыванию, но у них есть серьезные проблемы с производительностью и были удалены в Python 3, оставив только предпочтительный подход к настройке - пользовательские функции извлечения ключей ... намного быстрее, хотя и более деликатны для относительно редкого варианта использования смешанных сортировок по возрастанию / убыванию .

В Python 2. * , который поддерживает любой вид настройки (не , оба в одном вызове sort или sorted ] :-), пользовательская функция сравнения может быть передана как cmp = именованный аргумент; или пользовательская функция извлечения ключа может быть передана как именованный аргумент key = . В Python 3. * доступен только последний вариант.

Определенно стоит разобраться в методе извлечения ключей, даже если вы думаете, что только что решили свою проблему с помощью подхода пользовательского сравнения. : не только для производительности, но и для обеспечения перспективности (Python 3) и для универсальности (подход key = также применяется к min , max , ] itertools.groupby ... гораздо более общий, чем подход cmp = !).

Извлечение ключей очень просто, когда все ключевые подполя должны быть отсортированы одинаково (все по возрастанию или по убыванию) - вы просто извлекаете их; все еще довольно просто, если подполя, которые идут «в другую сторону», являются числами (вы просто меняете их знак при извлечении); три для функции извлечения ключей и, конечно же, один для вызова sort или sorted - всего восемь против 4 + 1 == 5 в подходе пользовательского сравнения в наиболее компактная форма (то есть тот, который использует либо cmp со сменой знака, либо cmp с замененными аргументами). Три утверждения - не большая плата за преимущества извлечения ключей! -)

Производительность явно не является большой проблемой с таким коротким списком, но даже с гораздо более длинным (в 10 раз) списком ...:

# my_list as in the Q, my_cmp as per top A, getkey as here

def bycmp():
  return sorted(my_list*10, cmp=my_cmp)

def bykey():
  return sorted(my_list*10, key=getkey)

...

$ python -mtimeit -s'import so' 'so.bykey()'
1000 loops, best of 3: 548 usec per loop
$ python -mtimeit -s'import so' 'so.bycmp()'
1000 loops, best of 3: 995 usec per loop

То есть, подход key = уже показывает почти двукратный прирост производительности (сортировка списка вдвое быстрее) при работе со списком из 50 пунктов, что стоит скромной цены "8. линий, а не 5 ", особенно со всеми другими преимуществами, которые я уже упоминал!

и, конечно же, один для вызова sort или sorted - всего восемь против 4 + 1 == 5 в подходе пользовательского сравнения в наиболее компактной форме (т.е. используя либо cmp со сменой знака, либо cmp с замененными аргументами). Три утверждения - не большая плата за преимущества извлечения ключей! -)

Производительность явно не является большой проблемой с таким коротким списком, но даже с гораздо более длинным (в 10 раз) списком ...:

# my_list as in the Q, my_cmp as per top A, getkey as here

def bycmp():
  return sorted(my_list*10, cmp=my_cmp)

def bykey():
  return sorted(my_list*10, key=getkey)

...

$ python -mtimeit -s'import so' 'so.bykey()'
1000 loops, best of 3: 548 usec per loop
$ python -mtimeit -s'import so' 'so.bycmp()'
1000 loops, best of 3: 995 usec per loop

То есть, подход key = уже показывает почти двукратный прирост производительности (сортировка списка вдвое быстрее) при работе со списком из 50 пунктов, что стоит скромной цены "8. линий, а не 5 ", особенно со всеми другими преимуществами, которые я уже упоминал!

и, конечно же, один для вызова sort или sorted - всего восемь против 4 + 1 == 5 в подходе пользовательского сравнения в наиболее компактной форме (т.е. используя либо cmp со сменой знака, либо cmp с замененными аргументами). Три утверждения - не большая плата за преимущества извлечения ключей! -)

Производительность явно не является большой проблемой с таким коротким списком, но даже с более длинным (в 10 раз) списком ...:

# my_list as in the Q, my_cmp as per top A, getkey as here

def bycmp():
  return sorted(my_list*10, cmp=my_cmp)

def bykey():
  return sorted(my_list*10, key=getkey)

...

$ python -mtimeit -s'import so' 'so.bykey()'
1000 loops, best of 3: 548 usec per loop
$ python -mtimeit -s'import so' 'so.bycmp()'
1000 loops, best of 3: 995 usec per loop

То есть, подход key = уже показывает почти двукратный прирост производительности (сортировка списка вдвое быстрее) при работе со списком из 50 пунктов, что стоит скромной цены "8. линий, а не 5 ", особенно со всеми другими преимуществами, которые я уже упоминал!

тот, который использует либо cmp со сменой знака, либо cmp с замененными аргументами). Три утверждения - не большая плата за преимущества извлечения ключей! -)

Производительность явно не является большой проблемой с таким коротким списком, но даже с более длинным (в 10 раз) списком ...:

# my_list as in the Q, my_cmp as per top A, getkey as here

def bycmp():
  return sorted(my_list*10, cmp=my_cmp)

def bykey():
  return sorted(my_list*10, key=getkey)

...

$ python -mtimeit -s'import so' 'so.bykey()'
1000 loops, best of 3: 548 usec per loop
$ python -mtimeit -s'import so' 'so.bycmp()'
1000 loops, best of 3: 995 usec per loop

То есть, подход key = уже показывает почти двукратный прирост производительности (сортировка списка вдвое быстрее) при работе со списком из 50 пунктов, что стоит скромной цены "8. линий, а не 5 ", особенно со всеми другими преимуществами, которые я уже упоминал!

тот, который использует либо cmp со сменой знака, либо cmp с замененными аргументами). Три утверждения - не большая плата за преимущества извлечения ключей! -)

Производительность явно не является большой проблемой с таким коротким списком, но даже с более длинным (в 10 раз) списком ...:

# my_list as in the Q, my_cmp as per top A, getkey as here

def bycmp():
  return sorted(my_list*10, cmp=my_cmp)

def bykey():
  return sorted(my_list*10, key=getkey)

...

$ python -mtimeit -s'import so' 'so.bykey()'
1000 loops, best of 3: 548 usec per loop
$ python -mtimeit -s'import so' 'so.bycmp()'
1000 loops, best of 3: 995 usec per loop

То есть, подход key = уже показывает почти двукратный прирост производительности (сортировка списка вдвое быстрее) при работе со списком из 50 пунктов, что стоит скромной цены "8. линий, а не 5 ", особенно со всеми другими преимуществами, которые я уже упоминал!

8
ответ дан 18 December 2019 в 07:55
поделиться
def my_cmp(x, y):
  x1, x2 = x[0].split('_')
  y1, y2 = y[0].split('_')
  return -cmp(x1, y1) or cmp(x2, y2)

my_list = [
    (u'community_news', u'Community: News & Information'), 
    (u'kf_video', u'KF: Video'), 
    (u'community_video', u'Community: Video'), 
    (u'kf_news', u'KF: News & Information'), 
    (u'kf_magazine', u'KF: Magazine')
]

sorted_list = [
    (u'kf_magazine', u'KF: Magazine'),
    (u'kf_news', u'KF: News & Information'), 
    (u'kf_video', u'KF: Video'), 
    (u'community_news', u'Community: News & Information'), 
    (u'community_video', u'Community: Video'), 
]

my_list.sort(cmp=my_cmp)
assert my_list == sorted_list
10
ответ дан 18 December 2019 в 07:55
поделиться
>>> def my_cmp(tuple_1, tuple_2):
    xxx_1, yyy_1 = tuple_1[0].split('_')
    xxx_2, yyy_2 = tuple_2[0].split('_')
    if xxx_1 > xxx_2:
        return -1
    elif xxx_1 < xxx_2:
        return 1
    else:
        return cmp(yyy_1, yyy_2)


>>> import pprint
>>> pprint.pprint(sorted(mylist, my_cmp))
[(u'kf_magazine', u'KF: Magazine'),
 (u'kf_news', u'KF: News & Information'),
 (u'kf_video', u'KF: Video'),
 (u'community_news', u'Community: News & Information'),
 (u'community_video', u'Community: Video')]

Не самое красивое решение в мире ...

2
ответ дан 18 December 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: