Самый короткий код для печати строки начинается с ['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()
Другие вопросы по тегам