[Python] Максимальный кортеж в списке
От: slava_phirsov Россия  
Дата: 24.03.10 13:53
Оценка: :)
Здравствуйте, собственно, сабж. Имеем список кортежей чисел, все кортежи одинаковой длины, требуется выбрать из них такой кортеж a, что: a[0] > b[0] или (a[0] == b[0] и a[1] > b[1]) или (a[0] == b[0] и a[1] == b[1] и a[2] > b[2]) или ... ит.д., для любого b из этого списка при условии, что b и a — разные объекты. Надеюсь, идея понятна. Можно, конечно, сделать вот так:


def cmp_tuples(a, b):
  for i in range(len(a)):
    if (a[i] == b[i]):
      continue
    else:
      return 1 - 2 * (b > a)
  return 0

def max_tuple(tuples):
  return sorted(tuples, cmp=cmp_tuples)[0]


,но это как-то аля маляр Шлемиль.

Стандартная функция max не принимает (в отличие от функции sort) аргумента cmp:

The optional key argument specifies a one-argument ordering function like that used for list.sort()


Есть предложения как решить задачку более кошерным методом, без полной сортировки?

Заранее благодарю
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re: [Python] Максимальный кортеж в списке
От: eugals Россия  
Дата: 24.03.10 14:06
Оценка:
Здравствуйте, slava_phirsov, Вы писали:

_>Есть предложения как решить задачку более кошерным методом, без полной сортировки?


странный вопрос

>>> (1, 2) > (1, 3)
False
>>> l = [(1, 2), (2, 3), (2, 2)]
>>> max(l)
(2, 3)
Re: [Python] Максимальный кортеж в списке
От: Temoto  
Дата: 24.03.10 14:07
Оценка:
_>Здравствуйте, собственно, сабж. Имеем список кортежей чисел, все кортежи одинаковой длины, требуется выбрать из них такой кортеж a, что: a[0] > b[0] или (a[0] == b[0] и a[1] > b[1]) или (a[0] == b[0] и a[1] == b[1] и a[2] > b[2]) или ... ит.д., для любого b из этого списка при условии, что b и a — разные объекты. Надеюсь, идея понятна. Можно, конечно, сделать вот так:

_>Стандартная функция max не принимает (в отличие от функции sort) аргумента cmp:

_>

_>The optional key argument specifies a one-argument ordering function like that used for list.sort()


_>Есть предложения как решить задачку более кошерным методом, без полной сортировки?


_>Заранее благодарю


То есть, задача — найти самый большой тупл.

max(xs)

Уж не знаю, зачем вам тут понадобилась кастомная функция сравнения.
Re[2]: [Python] Максимальный кортеж в списке
От: slava_phirsov Россия  
Дата: 24.03.10 14:41
Оценка:
Здравствуйте, eugals, Вы писали:

E>
>>>> (1, 2) > (1, 3)
E>False
>>>> l = [(1, 2), (2, 3), (2, 2)]
>>>> max(l)
E>(2, 3)
E>



Странно, никогда про такую фишку не слышал, даже на python.org. Или проворонил

Не имею сейчас под рукой интерпретатора, a:

>>>> max([(1, 2), (2, 3), (2, 2), (1, 4)])
>>>> (2, 3)

, или как?

А кастомную функцию сравнения все же хочется прикрутить. Потому, что порядок обхода членов кортежа при сортировке может быть разным
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[3]: [Python] Максимальный кортеж в списке
От: Temoto  
Дата: 24.03.10 14:49
Оценка: 1 (1)
_>Странно, никогда про такую фишку не слышал, даже на python.org. Или проворонил

_>Не имею сейчас под рукой интерпретатора, a:


_>
>>>>> max([(1, 2), (2, 3), (2, 2), (1, 4)])
>>>>> (2, 3)
_>

_>, или как?

Да. Туплы сравниваются поэлементно.

_>А кастомную функцию сравнения все же хочется прикрутить. Потому, что порядок обхода членов кортежа при сортировке может быть разным


key — мощный и удобный инструмент для кастомных сравнений.

xs = [(1, 2), (2, 3), (2, 2), (1, 4)]
max(xs, key=lambda (a,b): b,a) # он же max(xs, key=reversed)
(1, 4)
Re[3]: [Python] Максимальный кортеж в списке
От: Temoto  
Дата: 24.03.10 14:49
Оценка:
_>Не имею сейчас под рукой интерпретатора, a:

На codepad.org интерпретатор всегда под рукой.
Re[3]: [Python] Максимальный кортеж в списке
От: eugals Россия  
Дата: 24.03.10 14:59
Оценка:
Здравствуйте, slava_phirsov, Вы писали:


_>Странно, никогда про такую фишку не слышал, даже на python.org. Или проворонил

(первая же ссылка в гугле по запросу "tuple comparison")

_>Не имею сейчас под рукой интерпретатора, a:

_>
>>>>> max([(1, 2), (2, 3), (2, 2), (1, 4)])
>>>>> (2, 3)
_>

Да.

_>А кастомную функцию сравнения все же хочется прикрутить. Потому, что порядок обхода членов кортежа при сортировке может быть разным

про max(key=...) уже сказали.
ещё есть функция reduce. До 3.0 она была builtin, а после этого переехала в модуль functools
Re[4]: [Python] Максимальный кортеж в списке
От: eugals Россия  
Дата: 24.03.10 15:09
Оценка:
Здравствуйте, Temoto, Вы писали:

T>max(xs, key=lambda (a,b): b,a) # он же max(xs, key=reversed)

Лень проверять, но подозреваю, что
xs = [(1, 2), (2, 3), (2, 2), (1, 4)]
max((b, a) for a, b in xs)

будет эффективнее.

нагляднее уж точно
Re[4]: [Python] Максимальный кортеж в списке
От: slava_phirsov Россия  
Дата: 27.03.10 17:55
Оценка:
Здравствуйте, eugals, Вы писали:
...

Да, действительно


Tuples and lists are compared lexicographically using comparison of corresponding elements. This means that to compare equal, each element must compare equal and the two sequences must be of the same type and have the same length.

If not equal, the sequences are ordered the same as their first differing elements. For example, cmp([1,2,x], [1,2,y]) returns the same as cmp(x,y). If the corresponding element does not exist, the shorter sequence is ordered first (for example, [1,2] < [1,2,3]).


Я действительно не там искал: built-in типы данных описываются в Python library reference, а операция сравнения — в Python language reference. Где разум, где логика?
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.