2013-08-16 3 views
1

Я новичок в Python, как свидетельствует имя экрана. Я пытался сортировать список кортежей, думаю (x, y) пар в списке и столкнулся с проблемой. Моя цель состоит в том, чтобы отсортировать список кортежей по й переменным в порядке возрастания в первую очередь, но потом вродеСложность Сортировка кортежей с itemgetter

Я исследовал вика на HowToSort в http://wiki.python.org/moin/HowTo/Sorting/ и думал, что я хотел бы попробовать оператор модуль и itemgetter функции в виде ключ.

Простая функция sorted() может сортировать кортеж в порядке, но если вы хотите, чтобы один индекс возрастал и один по возрастанию, я теряюсь. Вот код:

from operator import itemgetter, attrgetter 

ItemList = [(1,7),(2,1),(1,5),(1,1)] 
# Want list sorted with X values descending, then y values ascending 
# expected [(2, 1), (1, 1), (1,5), (1, 7)] 

print 
print ' Input:', ItemList 
print 'Output1:',sorted(ItemList, reverse = True) 
print 

print ' Input:', ItemList 
print 'Output2:', sorted(ItemList, key = itemgetter(-0,1)) 
print 
print ' WANTED:', '[(2, 1), (1, 1), (1,5), (1, 7)]' 

со следующим выходом:

Input: [(1, 7), (2, 1), (1, 5), (1, 1)] 
Output1: [(2, 1), (1, 7), (1, 5), (1, 1)] 

    Input: [(1, 7), (2, 1), (1, 5), (1, 1)] 
Output2: [(1, 1), (1, 5), (1, 7), (2, 1)] 

WANTED: [(2, 1), (1, 1), (1, 5), (1, 7)] 

я, очевидно, не понимают функцию itemgetter, так что любая помощь будет оценена по этому вопросу.

Кроме того, любые идеи о том, как сделать два вида по (x, y) парам? Я надеюсь избежать лямбда-решения, но я уверен, что это происходит. Благодарю.

+0

Как '[(2, 1), (1, 1), (2, 1), (1, 7)]' сортируется с 'x'-значениями по убыванию? – arshajii

+0

Ваш выход WANTED не имеет смысла. Я думаю, вы ошибались и означали «[(2, 1), (1, 1), (1, 5), (1, 7)]» вместо этого. –

+0

Да, спасибо. Я только что исправил это. –

ответ

2

-0 есть такое же изделие как 0. Более того, отрицательные индексы имеют другое значение: itemgetter(); это не означает, что значения отрицательны.

Используйте lambda вместо:

sorted(ItemList, key=lambda item: (-item[0], item[1])) 

Демо:

>>> ItemList = [(1,7),(2,1),(1,5),(1,1)] 
>>> sorted(ItemList, key=lambda item: (-item[0], item[1])) 
[(2, 1), (1, 1), (1, 5), (1, 7)] 

Отрицательные индексы принимают элементы из конца последовательности:

>>> end = itemgetter(-1) 
>>> end([1, 2, 3]) 
3 

itemgetter() никогда не будет изменять извлеченный элемент, c безусловно, не отрицает его.

Обратите внимание, что itemgetter() только удобный метод, вы не имеют использовать его и для более сложных заказов сортировки, пользовательские функции или лямбда является лучшим выбором.

+0

Бинго! Спасибо! Я знал, что это _lambda_. Я должен перестать бояться ** лямбда ** !! –

+2

@NewatPython: любые вызываемые вызовы будут делать, но здесь удобнее использовать lambda. Функция может служить той же цели. –

Смежные вопросы