在字符串中使用len()

时间:2014-02-24 08:03:03

标签: python string

如何在不使用变量的情况下找到以下字符串的长度?

string = "This is a sentence and it has %d characters" % len(string)

print string

这个不起作用。什么是正确的编码方式?

5 个答案:

答案 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)将产生正确的答案。

有时答案不需要(很多)代码: - )