如何在不使用变量的情况下找到以下字符串的长度?
string = "This is a sentence and it has %d characters" % len(string)
print string
这个不起作用。什么是正确的编码方式?
答案 0 :(得分:2)
在你的句子中,你试图在给它任意值
之前评估字符串长度string = "This is a sentence and it has %d characters" % len(string)
你应该考虑可以做到的地方,即:
string = "%d chars.."
可以平等扩展到
string = "9 chars.."
并且:
string = "10 chars.."
答案 1 :(得分:1)
在为其指定内容之前,你不能取字符串的长度,所以在进行替换之前这样做,然后用简单的数学计算出结果的长度:
POWERS_OF_TEN = {10**n for n in range(7)} # handle strings over 10M chars long
string = "This is a sentence and it has %d characters"
length = len(string) - len('%d') + len("%d" % len(string))
correction = len(string)+1 in POWERS_OF_TEN
string %= length+correction
print(string) # This is a sentence and it has 43 characters
上面的计算正确处理了结果的长度不同于其中包含"%d"
的原始字符串的长度的情况。
以下测试代码说明了这一点,它显示了原始字符串及其长度,后面是结果字符串以及不同大小的输入的实际和计算长度 - 如您所见,后两个值始终匹配,包括在特殊情况下,添加一个字符使得结果字符串变长两个字符:
for i in range(0, 10+1):
string = (''.join(chr(ord('A')+(d-1)%26) if d else ''
for d in range(0, i+1))+ "%d")
length = len(string) - len('%d') + len("%d" % len(string))
correction = len(string)+1 in POWERS_OF_TEN
string2 = string % (length+correction)
print('{!r}, len: {} -> {!r}, length actual: {} vs computed: {}'.format(
string, len(string), string2, len(string2), length))
输出:
'%d', len: 2 -> '1', length actual: 1 vs computed: 1
'A%d', len: 3 -> 'A2', length actual: 2 vs computed: 2
'AB%d', len: 4 -> 'AB3', length actual: 3 vs computed: 3
'ABC%d', len: 5 -> 'ABC4', length actual: 4 vs computed: 4
'ABCD%d', len: 6 -> 'ABCD5', length actual: 5 vs computed: 5
'ABCDE%d', len: 7 -> 'ABCDE6', length actual: 6 vs computed: 6
'ABCDEF%d', len: 8 -> 'ABCDEF7', length actual: 7 vs computed: 7
'ABCDEFG%d', len: 9 -> 'ABCDEFG9', length actual: 8 vs computed: 8
'ABCDEFGH%d', len: 10 -> 'ABCDEFGH10', length actual: 10 vs computed: 10
'ABCDEFGHI%d', len: 11 -> 'ABCDEFGHI11', length actual: 11 vs computed: 11
'ABCDEFGHIJ%d', len: 12 -> 'ABCDEFGHIJ12', length actual: 12 vs computed: 12
答案 2 :(得分:0)
硬编码答案:
string = "This is a sentence and it has 43 characters"
对于更一般的情况,您可以使用迭代近似:
base = "This sentence has %d characters"
n = 1
while len(base % n) != n:
n = len(base % n)
string = base % n
您的代码尝试获取尚不存在的字符串的长度。那不行。使用不同的输入,甚至可以有多种方法来填补空白:
string = "chars: %d"
9或10?谁知道呢。
答案 3 :(得分:0)
实际上这不起作用,因为在赋值之前引用了字符串。 除此之外,这将无法通过设计工作,因为在转移意义上,您正在创建递归。你试图得到一个字符串的长度,其长度取决于字符串本身的长度(嗯?) 要解决这样的问题,可以(!!!)迭代解决:
l =42
while True:
s = "This is a sentence and it has %d characters" % l
if len(s)==l:
break
l = sample_new_length()
通过选择合适的采样函数,可以解决这个问题。
答案 4 :(得分:0)
这基本上是你所说的方式的常量。
如果它是部分可变的,你只需要一个常数来反映不会改变的部分,例如: len("This sentence has")
+ len("characters")
。
在发布此类字符串之前,只需评估变量部分。此时,添加常量部分的len(string)
将产生正确的答案。
有时答案不需要(很多)代码: - )