如何使这个 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 代码成为一个单行代码?
【问题讨论】:
t
和 s
原来是什么?另外,您确定这段代码确实按照您的意愿执行了吗?
原来,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
中创建一个元组。变量t
和s
可以像ts[0]
和ts[1]
一样赋值。
【讨论】:
原始代码检查line
本身是否等于“t”,而不是行的每个元素是否等于“t”。
@JohnGordon 啊,对不起。没看到。
为什么还要使用列表推导? Python 有一个list.count
函数。这与pythonic相反。
@VivekUpadhyay 你可以指定t
和s
像t,s=ts
@Nick 抱歉,我没有意识到有一个 list.count
函数。另外,这正是我会做的方式【参考方案3】:
使用 count() 怎么样? line.count("t")
将返回字符串“t”在该行中出现的次数?需要注意的是,变量t
首先被解包,以便分配给s
的len(line) - t
可以在赋值时使用。
>>> line = "ttttttseeeee"
>>> t, s = line.count("t"), len(line) - t
>>> t
6
>>> s
8
【讨论】:
jfyi,s
计算非"t"
字符的数量。
抱歉,我更新了帖子以上是关于如何使这个 python 代码成为一个衬里? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章