Использование функций min () и max () с несколькими строками

#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 .