如何使这个 python 代码成为一个衬里? [关闭]

Posted

技术标签:

【中文标题】如何使这个 python 代码成为一个衬里? [关闭]【英文标题】:How do I make this python code a one liner? [closed] 【发布时间】:2021-11-14 03:16:39 【问题描述】:
for _ in line:
    if line == "t":
        t += 1  
    else:
        s += 1 

如何使这个 python 代码成为一个单行代码?

【问题讨论】:

ts 原来是什么?另外,您确定这段代码确实按照您的意愿执行了吗? 原来,t = 0 and s = 0 我不认为代码是你想要的。 【参考方案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

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

【讨论】:

@KetZoomer 如果line == "t" 为真,我不确定您认为len(line) 可以是什么,而不是1。 @KetZoomer 正是 kaya3 所说的。不知道为什么这被否决了。这与 OP 写的完全一样。我现在正在为它写一些测试。 我没有投反对票,我同意这个答案是唯一一个等同于 OP 代码的答案。但我也没有投票,因为我不认为这实际上是 OP 想要做的——他们的代码似乎更有可能一开始就错了——我怀疑这可能是有人投票反对的原因。无论哪种方式,问题都需要改进,要么修复代码以使其符合 OP 的要求,要么确认这实际上是 OP 想要的。 @kaya3 我更新了我的答案以包含替代方案。 好的,我现在投票了;顺便说一句,如果您使用像s = len(line) - (t := line.count("t")) 这样的赋值表达式,您可以在一行中完成,而无需调用两次.count【参考方案2】:

试试这个:

ts=(len([x for x in line if x=="t"]),len([x for x in line if x!="t"]))

两个生成器语句通过line 并创建一个列表,其中包含或不是"t" 的字母,然后用len 和括号括起来,以在ts 中创建一个元组。变量ts 可以像ts[0]ts[1] 一样赋值。

【讨论】:

原始代码检查line本身是否等于“t”,而不是行的每个元素是否等于“t”。 @JohnGordon 啊,对不起。没看到。 为什么还要使用列表推导? Python 有一个list.count 函数。这与pythonic相反。 @VivekUpadhyay 你可以指定tst,s=ts @Nick 抱歉,我没有意识到有一个 list.count 函数。另外,这正是我会做的方式【参考方案3】:

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

>>> line = "ttttttseeeee"
>>> t, s = line.count("t"), len(line) - t
>>> t
6
>>> s
8

【讨论】:

jfyi, s 计算非"t" 字符的数量。 抱歉,我更新了帖子

以上是关于如何使这个 python 代码成为一个衬里? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

获取系统字体使用的 Raleway 衬里数字

我如何在这个数组中获取数据,如果条件使它成为python中距离最小的集群?

Python:如何使变量成为另一个变量和字符串的混合?

如何使此代码成为模块

如何使用一个衬里 msl 遍历列表?

一个衬里使用过滤器删除数组中所有出现的子串吗?