Максимум два кортежа
В документации на 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"""