如何在Python中去除空格而不使用字符串方法?

3

我是一个相对新手程序员,一直在通过HackerRank学习相关知识。然而,我目前卡在了一个任务上。我尝试了几种方法,但仍然无法弄清楚我的问题出在哪里。

任务要求:输入N并输出0到N之间的数字,不能包含任何空格或使用字符串方法。

N = int(input())
listofnum = []

for i in range(1, N +1):
    listofnum.append(i)
print (*(listofnum))

输出:

1 2 3

2
为什么不在循环内打印数字?你不需要为此创建数组。只需使用print(i, end="")即可。 - Yevhen Kuzmovych
@EvgenyKuzmovich:非常感谢!我不熟悉end='',但现在一定会去了解一下。 - CTLearn
@EvgenyKuzmovich:您能否将您的答案添加为评论,以便我可以标记它,其他人以后可以参考它? - CTLearn
当然,已经完成。 - Yevhen Kuzmovych
7个回答

2

不使用任何字符串方法,只使用整除和 list 倒转数字,使用 sys.stdout.write 打印它们:

import sys
N = int(input())

for i in range(1,N+1):
    l=[]
    while(i):
        l.append(i%10)
        i //= 10
    for c in reversed(l):
        sys.stdout.write(chr(c+48))

或者像tdelaney建议的那样,更加硬编码的方法:

import os,sys,struct

N = int(input())

for i in range(1,N+1):
    l=[]
    while(i):
        l.append(i%10)
        i //= 10
    for c in reversed(l):
        os.write(sys.stdout.fileno(), struct.pack('b', c+48))

虽然这样做很有趣,但最好的方法是使用生成器推导式和 str.join()str 构造函数来完成,只需要一行代码:

"".join(str(x) for x in range(1,N+1))

每个数字都被转换为字符串,而join运算符只用空分隔符连接所有数字。


"".join 是一个内置的字符串方法。Chris 和 Alex 刚刚向我指出,它不是一个运算符。 - Christian Dean
我编辑了我的答案,您不会看到其中的“str”单词。 - Jean-François Fabre
很棒的答案!但是chr仍然算作字符串方法吗?它调用了str.__init__。这里可能需要调用struct.pack('b', c+48) - tdelaney
@Jean-FrançoisFabre os.write(sys.stdout.fileno(), struct.pack('b', 0x30)) 不要字符串! - tdelaney
没问题!你对Python底层的知识非常出色。我在那里学到了一些东西... - Jean-François Fabre
显示剩余4条评论

2
N = int(input())
answer = ''
for i in range(1, N + 1):
    answer += str(i)
print(answer)

这是我能想到的最接近“不使用任何字符串方法”的方法,虽然技术上它在后台使用了str.__new__/__init__/__add__或类似的方法。我确信它比使用''.join更符合问题要求。

为什么不使用 repr 而是使用 str?对我来说,str 看起来太像“使用字符串方法”了。 - Scott Mermelstein

1
您可以在循环内部打印数字。只需在print中使用end关键字即可:

print(i, end="")

@Jean-FrançoisFabre 显然你不能不使用字符串就打印任何内容。我认为任务要求你不能使用字符串方法,而我没有使用。 - Yevhen Kuzmovych
我认为那些挑战有点有趣但很蠢。最有效的方法就是用join函数。而且看看我的答案(在tdelaney的帮助下): 没有任何附带条件 :) - Jean-François Fabre

0
尝试使用 ''.join([str(i) for i in range(N)])

"".join 是一个内置的字符串 方法。Chris 和 Alex 刚刚向我指出了这一点。 - Christian Dean

0

你可以利用print()sep参数来“绑定”列表推导中的每个数字:

>>> print(*[el for el in range(0, int(input())+1)], sep="")
10
012345678910
>>>

join 是一个字符串方法,是吗? - Chris Mueller
@leaf 不确定你的意思,如果你检查它,你会得到<built-in method join of str object at 0x10df76ab0> - Alex Hall

0
一种实现这个的方法是将数字追加到一个空字符串中。
out = ''
for i in range(N):
    out += str(i)
print(out)

0

你需要进行简单的数学计算。他们希望你将列表中的每个元素乘以十的幂并相加。例如,假设你有一个数组; a = [2,3,5] 你需要输出; 235

然后,你从右到左依次将循环元素乘以10^0、10^1和10^2。在生成字符串列表后使用此代码。

a = map(int,a)
for i in range(len(a)):
    sum += (10**i)*a[-i]
print sum

你完成了!


你的代码不能直接运行。请提供一个可工作的片段。 - Jean-François Fabre
两件事:首先,有更有效的方法(例如 total = 0; for i in range(n):; total = total * 10 + i)。其次,我们没有得到 N 可以是多少的限制。这个想法适用于数字,但如果我们需要输出从0到11的数字呢?该算法将无法生成01234567891011。 - Scott Mermelstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接