打印行的最短代码以 ['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
使用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()
startswith
和 endswith
也接受元组作为参数(参见 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()
对于作业,我必须打印以 "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
使用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()
startswith
和 endswith
也接受元组作为参数(参见 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()