Максимум два кортежа

В документации на Python указано, что при вызове с несколькими аргументами max() возвращает самый большой из аргументов.

>>> a = (1, 1, 1, 9)
>>> b = (4, 5, 6)
>>> max(a, b)
(4, 5, 6)

Что определяет, насколько большой кортеж в этом контексте? Кортеж a имеет как большее число элементов (четыре против трех), так и его максимальное значение (9) больше максимального числа, которое можно найти в b (6), поэтому по любым критериям я ожидал, что это будет вернулся. Как сравнить кортежи с помощью max()?

Ответ 1

Кортежи, как и все остальные последовательности, упорядочены лексикографически: порядок двух кортежей определяется первой позицией, где кортежи различаются. Цитата из справки python:

Кортежи и списки сравниваются лексикографически, используя сравнение соответствующие элементы.

Ваши два кортежа отличаются в первой позиции, а так как 4 > 1, мы имеем

>>> (4, 5, 6) > (1, 1, 1, 9)
True

Ответ 2

Слева направо сравнивается каждый элемент кортежей, пока он не найдет его больше другого. Затем возвращается этот кортеж. Например

>>> a = (2,0,0,0)
>>> b= (1,1,1,1)
>>> max(a,b)
(2, 0, 0, 0)

>>> b = (2,1,1,1)
>>> max(a,b)
(2, 1, 1, 1)

После того, как элемент найден в одном кортеже, который больше соответствующего элемента в другом, остальные значения не влияют на возврат кортежа.

Ответ 3

Они сравниваются по одному элементу за раз, подобно любой другой последовательности. Это (возможно) проще всего понять, если сравнить его со строковым сравнением:

>>> (1, 2, 3) > (1, 2, 4)
False
>>> (2, 2, 3) > (1, 2, 4)
True
>>> 'abc' > 'abd'
False
>>> 'bbc' > 'abd'
True

Ответ 4

Сравнение с использованием < должен быть примерно эквивалентен:

def compare(a,b):
    print ""
    print "testing %s < %s" %(str(a),str(b))
    for ai,bi in zip(a,b):
        print "comparing elements",ai,bi
        if ai < bi:
            return True
        if bi < ai:
            return False
    if len(a)<len(b):
        return True
    return False

test_cases = [tuple([1]),(1,2),(1,1),(1,1,1),(None,None,None),tuple([None]),(99,99)]

print "running tests"
for a in test_cases:
    for b in test_cases:
        assert(compare(a,b) == (a<b))
"""
>>>
running tests

testing (1,) < (1,)
comparing elements 1 1

testing (1,) < (1, 2)
comparing elements 1 1

testing (1,) < (1, 1)
comparing elements 1 1

testing (1,) < (1, 1, 1)
comparing elements 1 1

testing (1,) < (None, None, None)
comparing elements 1 None

testing (1,) < (None,)
comparing elements 1 None

testing (1,) < (99, 99)
comparing elements 1 99

testing (1, 2) < (1,)
comparing elements 1 1

testing (1, 2) < (1, 2)
comparing elements 1 1
comparing elements 2 2

testing (1, 2) < (1, 1)
comparing elements 1 1
comparing elements 2 1

testing (1, 2) < (1, 1, 1)
comparing elements 1 1
comparing elements 2 1

testing (1, 2) < (None, None, None)
comparing elements 1 None

testing (1, 2) < (None,)
comparing elements 1 None

testing (1, 2) < (99, 99)
comparing elements 1 99

testing (1, 1) < (1,)
comparing elements 1 1

testing (1, 1) < (1, 2)
comparing elements 1 1
comparing elements 1 2

testing (1, 1) < (1, 1)
comparing elements 1 1
comparing elements 1 1

testing (1, 1) < (1, 1, 1)
comparing elements 1 1
comparing elements 1 1

testing (1, 1) < (None, None, None)
comparing elements 1 None

testing (1, 1) < (None,)
comparing elements 1 None

testing (1, 1) < (99, 99)
comparing elements 1 99

testing (1, 1, 1) < (1,)
comparing elements 1 1

testing (1, 1, 1) < (1, 2)
comparing elements 1 1
comparing elements 1 2

testing (1, 1, 1) < (1, 1)
comparing elements 1 1
comparing elements 1 1

testing (1, 1, 1) < (1, 1, 1)
comparing elements 1 1
comparing elements 1 1
comparing elements 1 1

testing (1, 1, 1) < (None, None, None)
comparing elements 1 None

testing (1, 1, 1) < (None,)
comparing elements 1 None

testing (1, 1, 1) < (99, 99)
comparing elements 1 99

testing (None, None, None) < (1,)
comparing elements None 1

testing (None, None, None) < (1, 2)
comparing elements None 1

testing (None, None, None) < (1, 1)
comparing elements None 1

testing (None, None, None) < (1, 1, 1)
comparing elements None 1

testing (None, None, None) < (None, None, None)
comparing elements None None
comparing elements None None
comparing elements None None

testing (None, None, None) < (None,)
comparing elements None None

testing (None, None, None) < (99, 99)
comparing elements None 99

testing (None,) < (1,)
comparing elements None 1

testing (None,) < (1, 2)
comparing elements None 1

testing (None,) < (1, 1)
comparing elements None 1

testing (None,) < (1, 1, 1)
comparing elements None 1

testing (None,) < (None, None, None)
comparing elements None None

testing (None,) < (None,)
comparing elements None None

testing (None,) < (99, 99)
comparing elements None 99

testing (99, 99) < (1,)
comparing elements 99 1

testing (99, 99) < (1, 2)
comparing elements 99 1

testing (99, 99) < (1, 1)
comparing elements 99 1

testing (99, 99) < (1, 1, 1)
comparing elements 99 1

testing (99, 99) < (None, None, None)
comparing elements 99 None

testing (99, 99) < (None,)
comparing elements 99 None

testing (99, 99) < (99, 99)
comparing elements 99 99
comparing elements 99 99"""