for _ in line:
if line == "t":
t += 1
else:
s += 1
如何使这个 python 代码成为一个衬里?
def bar(line):
t = s = 0
for _ in line:
if line == "t":
t += 1
else:
s += 1
return t, s
相当于:
def foo(line):
t, s = (1, 0) if line == "t" else (0, len(line))
return t, s
测试一下:
import random
NUM_TESTS = 100
MAX_STR_LEN = 10
def get_rand_chs(l):
for _ in range(l):
o = random.randint(ord('a'), ord('z'))
yield chr(o)
def get_rand_str():
l = random.randint(0, MAX_STR_LEN)
return ''.join(ch for ch in get_rand_chs(l))
for _ in range(NUM_TESTS):
rand_str = get_rand_str()
print(f'Testing {rand_str!r}...')
assert bar(rand_str) == foo(rand_str)
注意:OP,您可能打算做的是:
def bar(line):
t = s = 0
for _ in line:
if _ == "t":
t += 1
else:
s += 1
return t, s
如果是这种情况,那么t
所做的就是计算"t"
s 的数量并s
计算其他字符,这可以分两行完成:
def foo(line):
t = line.count("t")
s = len(line) - t
return t, s
line.count("t")
如果您不介意拨打两次电话,当然可以在一行中完成。
根据@kaya3 的评论,这里有一个更紧凑的替代方案:
def foo(line):
s = len(line) - (t := line.count("t"))
return t, s
仅供参考,可以使用相同的测试代码来验证它们是否等效。
使用 count() 怎么样?line.count("t")
将返回字符串“t”在该行中出现的次数?请注意,变量t
首先解包,以便len(line) - t
分配给 的s
,可以在分配时使用。
>>> line = "ttttttseeeee"
>>> t, s = line.count("t"), len(line) - t
>>> t
6
>>> s
8
尝试这个:
ts=(len([x for x in line if x=="t"]),len([x for x in line if x!="t"]))
两个生成器语句通过line
并创建一个包含字母 is 或 not 的列表"t"
,然后将每个与周围len
括起来并在两者周围加上一些括号以创建一个 in 中的元组ts
。变量t
和s
可以像ts[0]
和一样赋值ts[1]
。