#python #python-3.x
#python #python-3.x
Вопрос:
Я работаю над короткой проблемой CodingBat: учитывая 2 строки, a и b, возвращайте строку вида short long short, с более короткой строкой снаружи и более длинной строкой внутри.
Вот что у меня есть:
def combo_string(a, b):
short = min(a, b)
long = max(a, b)
return short long short
Идея: min(a, b)
возвращал бы самую короткую из двух строк и max(a, b)
возвращал бы самую длинную из двух. Однако этот код работает непоследовательно.
combo_string('a', 'bb')
возвращает 'abba'
(правильный), но combo_string('Hello', 'hi')
возвращает 'HellohiHello'
(неправильный и фактически противоположный тому, что я хочу).
Я неправильно использую функции min () и max ()?
Ответ №1:
hello
в алфавитном порядке предшествует hi
, так что это «минимум». Что вы хотите сделать, так это использовать key
аргумент, чтобы указать, что вам нужна минимальная длина, а не минимальное значение.,,,
min(a, b, key=len)
Ответ №2:
Вам нужно указать ключевую функцию (которая будет len
). В противном случае Python будет сортировать лексикографически (в основном в алфавитном порядке), что почти наверняка не то, что вы хотите:
def combo_string(a, b):
short = min(a, b, key=len)
long = max(a, b, key=len)
return short long short
Например:
min('a', 'bb', key=len)
# 'a'
min('Hello', 'hi', key=len)
# 'hi'
По сути, вместо того, чтобы просто использовать операторы >
and <
для сравнения (т.Е. a > b
или что-то еще), функции min
and max
будут использовать результат key
функции (т.Е. len(a) > len(b)
или что-то еще).
Ответ №3:
Я неправильно использую функции min () и max ()?
Да. По сути, ваша проблема в том, что max(a, b)
это не совсем то, что вы думаете. max(a, b)
сравнивает строковые объекты a
и b
самих себя. Python реализует сравнения между строками не по длине строк, а по их лексикографическим значениям.
Это означает, что иногда max(a, b)
может случиться так, что это сработает, но не всегда. Вам нужно указать Python напрямую сравнивать длины строк с помощью len
.