打印行的最短代码以 ['a', 'b'] 开始并以 ['y', 'z'] Python 结束 3

Shortest code for printing line startswith ['a', 'b'] and endswith ['y', 'z'] Python 3

对于作业,我必须打印以 "W" 和 "Z" 开头并以 "n" 和 "t" 结尾的文本行(所以 W-n,W-t, Z-n, Z-t 组合)。我现在有一个可以使用的代码,但它似乎有点长,我想知道是否有办法缩短它?

这是代码:

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"),但出现类型错误(所有切片索引必须是整数或 None 或具有 __index__method)。

你可以这样做:

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

参见docs on Python regex syntax

使用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、space等一次或多次
  • [nt]$ 表示匹配 n 或 t(小写),并且 $ 仅当 行以这些值结束 时才使其匹配

或者您可以使用正则表达式

import re

r = re.compile(r^"[WZ].+[nt]$")

m = r.match('Woot')
m.group()

startswithendswith 也接受元组作为参数(参见 doc)。 所以这会起作用:

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()

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()