-3
for _ in line:
    if line == "t":
        t += 1  
    else:
        s += 1 

如何使这个 python 代码成为一个衬里?

4

3 回答 3

1
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

仅供参考,可以使用相同的测试代码来验证它们是否等效。

于 2021-11-14T03:38:12.763 回答
0

使用 count() 怎么样?line.count("t")将返回字符串“t”在该行中出现的次数?请注意,变量t首先解包,以便len(line) - t分配给 的s,可以在分配时使用。

>>> line = "ttttttseeeee"
>>> t, s = line.count("t"), len(line) - t
>>> t
6
>>> s
8
于 2021-11-14T03:34:44.680 回答
0

尝试这个:

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。变量ts可以像ts[0]和一样赋值ts[1]

于 2021-11-14T03:26:10.557 回答