Самый короткий код для печати строки начинается с ['a', 'b'] и заканчивается с ['y', 'z'] Python 3
Для выполнения задания я должен напечатать строки из текста, которые начинаются с "W" и "Z" и заканчиваются на "n" и "t" (то есть Wn, Wt, Zn, Zt combo's). Теперь у меня есть код, который работает, но он кажется немного длинным, и мне было интересно, есть ли способ сократить его?
Это код:
import sys
def main():
for line in sys.stdin:
line = line.rstrip()
if line.startswith("W") and line.endswith("n"):
print(line)
if line.startswith("W") and line.endswith("t"):
print(line)
if line.startswith("Z") and line.endswith("n"):
print(line)
if line.startswith("Z") and line.endswith("t"):
print(line)
main()
Как я уже сказал, это работает, но кажется немного сложным. Любые советы о том, как сократить?
Я старался line.startswith("Z","W")
а также line.endswith("t","n")
но я получаю ошибку типа (все индексы срезов должны быть целыми числами или отсутствовать или иметь __index__method).
5 ответов
Вы могли бы сделать это:
line = line.rstrip()
if line and line[0] in "WZ" and line[-1] in "nt":
print(line)
Или используйте регулярные выражения:
import re
# ...
if re.match(r'^[WZ].*[nt]$', line):
print(line)
# ^ beginning of string
# $ end of string
# [WX] matches W or X
# .* any character 0 or more times
Смотрите документы по синтаксису регулярных выражений Python.
startswith
а также endswith
также примите кортеж в качестве аргумента (см. документ). Так что это будет работать:
line.startswwith(('W', 'Z'))
line.endswith(('t','n'))
Ваш код может быть сокращен до:
import sys
def main():
for line in sys.stdin:
line = line.rstrip()
if line.startswith(("W", "Z")) and line.endswith(("n", "t")):
print(line)
main()
Или вы могли бы использовать регулярное выражение
import re
r = re.compile(r^"[WZ].+[nt]$")
m = r.match('Woot')
m.group()
Использование regex
,
import re
pattern = '[ZW].*[nt]$'
for line in sys.stdin:
line = line.rstrip()
mo = re.match(p, line)
if mo:
print(line)
Шаблон объяснил:
[ZW]
соответствует одному из двух символов; потому что мы используемre.match
, это соответствует только если строка начинается с шаблона. Так что это должно начинаться с Z или W.*
соответствует чему угодно; char, int, пробел и т. д. один или несколько раз[nt]$
означает совпадение n или t (нижний регистр) и$
делает это совпадением, только если строка заканчивается этими значениями
str.startswith позволяет вам вводить кортеж строк, вы должны использовать кортеж ("Z", "W"), а не "Z", "W".
import sys
def main():
for line in sys.stdin:
line = line.rstrip()
if line.startswith(("Z","W")) and line.endswith(("t","n")):
print(line)
main()