Не все же, но я слышал, что следующая версия Живой Messenger, вероятно, будет WPF. Это может быть достойное внимания сразу сделано. Microsoft определенно должна добраться, больше их собственных приложений, обновленных до WPF к действительно ", продает ее".
Пользовательские функции сравнения для сортировки, как предлагается в существующих ответах, действительно упрощают сортировку в сочетании по возрастанию и убыванию, но у них есть серьезные проблемы с производительностью и были удалены в 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 ", особенно со всеми другими преимуществами, которые я уже упоминал!
Производительность явно не является большой проблемой с таким коротким списком, но даже с более длинным (в 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 ", особенно со всеми другими преимуществами, которые я уже упоминал!
Производительность явно не является большой проблемой с таким коротким списком, но даже с более длинным (в 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 ", особенно со всеми другими преимуществами, которые я уже упоминал!
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
>>> 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')]
Не самое красивое решение в мире ...