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

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

【问题讨论】:

  • ts 原来是什么?另外,您确定这段代码确实按照您的意愿执行了吗?
  • 原来,t = 0 and s = 0
  • 我不认为代码是你想要的。

标签: python simplify one-liner


【解决方案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" 字符的数量。
  • 抱歉,我更新了帖子
猜你喜欢
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多