2013-03-22 2 views
0

Аргумент:Python - логическое дело

Учитывая 2 строки, изменить их в нижний регистр и проверить, если один из них в конце другой

Мой ответ:

a="xyz" 
b="12xyz" 
a = a.lower() 
b = b.lower() 
c=max(a,b) 
d=min(a,b) 
e=len(d) 
if d==c[-e:]: 
print True 
else: 
print False 

Он должен вернуть True. Но он возвращает False. Когда я даю это значение:

a="ambala12xyz" 
b="12xyz" 

оно возвращает True. В чем проблема?

+0

проверить значения c и d – gefei

+4

'max' и' min' не сравнивать строки на основе длины (которая, по-видимому, является предпосылкой, на которой основан ваш подход), но и в порядке сортировки. Например. 'max ('abc', 'c')' возвращает 'c'. –

+2

@FelixKling: на самом деле, в python вы _can_ используете 'max/min' для сравнения по длине:' x = max (a, b, key = len) ' – georg

ответ

2

Я думаю, кратчайшим и наиболее интуитивный способ:

a = a.lower() 
b = b.lower() 
print a.endswith(b) or b.endswith(a) 

Или, если вы хотите использовать макс, мин функции:

a = a.lower() 
b = b.lower() 
c = max(a, b, key=len) 
d = min(a, b, key=len) 
print d == c[-len(d):] 

Но на мой взгляд это не так е xclicit способом как с endswith функция. Также эта функция работает неправильно с строками одинаковой длины.

+0

правильно, он не работает на той же длине. Необходимо добавить еще одну строку. –

2

вы должны использовать endswith

In [13]: a="ambala12xyz" 

In [14]: b="12xyz" 

In [15]: b.endswith(a) 
Out[15]: False 

In [16]: a="xyz" 

In [17]: b="12xyz" 

In [18]: b.endswith(a) 
Out[18]: True 
+0

без этого я могу выполнить полный процесс с' if/else' , но в чем проблема в моем упомянутом коде? –

+0

Вы можете сделать 'if b.endswith (a)' также. Это 'max' и' min', вызывающие ошибку. – TyrantWave

2

Вы сравниваете символы, вам нужно сравнить строки по длине:

a="xyz" 
b="12xyz" 
a = a.lower() 
b = b.lower() 
if len(a) > len(b): 
    c, d = a, b 
else: 
    c, d = b, a 
e=len(d) 
# print d==c[-e:] 
# or: 
if d==c[-e:]: 
print True 
else: 
print False 
+0

Каков результат возврата 'max()/min()'? кратчайший? –

+0

@ slash-bang: Как я указал в своем комментарии, 'max' и' min' сортируют элементы по их естественному порядку (для строк это их алфавитный порядок), и затем они возвращают последний или первый элемент отсортированного списка. –

0

Если вы посмотрите на ваши переменные вы будете быстро увидеть, что происходит неверно:

a: xyz 
b: 12xyz 
c: xyz 
d: 12xyz 
e: 5 
c[-e]: xyz 

Тогда довольно ясно, что d! = c [-e:] (12xyz! = xyz).

Что вы делаете неправильно, что Вы предполагаете, что

min("abc", "defgh") 

вернет 3, но при выполнении макс() и мин() на строках вы сравниваете, какая строка является «выше» или «ниже», чтобы на самом деле вернуть «abc».

+0

Я сначала проверил min и max. так что будет 3. и он проверит последние 3 символа max с мин. –

+1

Фактически, когда вы выполняете «max()» в строке, она возвращает «самую высокую» строку, а не самый большой символ. Таким образом max («xyz», «12xyz») не вернет 5, а «xyz» (так как «xyz» поступает в алфавитном порядке после «12xyz»). Вот что я имел в виду, когда говорил, что вы должны печатать переменные. – doosh

1

Еще одна идея:

печати (a.lower() EndsWith (b.lower()) или b.lower() EndsWith (a.lower()).).

+0

без этого я знаю еще один способ. но проблема здесь? –

+0

no - как упоминалось в другом месте, проблема в том, что 'c = min (a, b)' не делает 'c' равной кратчайшей – sje397

+0

почему? Функция 'min()' возвращает кратчайшую строку. не так ли? и я просто сохранил его в переменных 'c'. –

Смежные вопросы