Python 在字符串中使用len()

Python 在字符串中使用len(),python,string,Python,String,如何在不使用变量的情况下查找下面字符串的长度 string = "This is a sentence and it has %d characters" % len(string) print string 这个不行。正确的编码方式是什么?硬编码答案: string = "This is a sentence and it has 43 characters" 对于更一般的情况,可以使用迭代近似: base = "This sentence has %d characters" n =

如何在不使用变量的情况下查找下面字符串的长度

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

print string
这个不行。正确的编码方式是什么?

硬编码答案:

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点?谁知道呢。

在你的句子中,你试图在给字符串赋值之前先计算它的长度

string = "This is a sentence and it has %d characters" % len(string)
你应该考虑哪里有可能做这件事,即:

 string = "%d chars.." 
可以同样扩展到

 string = "9 chars.." 
以及:

 string = "10 chars.."

实际上这不起作用,因为字符串是在赋值之前被引用的。 除此之外,这在设计上永远不会起作用,因为在转移的意义上,您正在创建一个递归。你试图得到一个字符串的长度,它的长度取决于字符串本身的长度(嗯?) 要解决这样的问题,可以(!!!)迭代地解决:

l =42
while True:
    s = "This is a sentence and it has %d characters" % l
    if len(s)==l:
      break
    l = sample_new_length()

通过选择适当的采样函数,可以解决这个问题。

这基本上是一个常数,在您陈述它的方式中

如果它是部分可变的,您只需要有一个反映不变部分的常数,例如
len(“这个句子有”)
+
len(“字符”)

在发布这样一个字符串之前,只需对变量部分进行求值。此时,添加常量部分的
len(string)
将得到正确答案


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

在为字符串赋值之前,您无法计算字符串的长度,因此在进行替换之前,请先这样做,然后用简单的数学计算出结果的长度:

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',长度:2->'1',实际长度:1与计算长度:1
“A%d”,长度:3->“A2”,实际长度:2与计算长度:2
“AB%d”,长度:4->“AB3”,实际长度:3与计算长度:3
'ABC%d',长度:5->'ABC4',实际长度:4与计算长度:4
'ABCD%d',长度:6->'ABCD5',实际长度:5与计算长度:5
“ABCDE%d”,长度:7->“ABCDE6”,实际长度:6与计算长度:6
“ABCDEF%d”,长度:8->“ABCDEF7”,实际长度:7与计算长度:7
“ABCDEFG%d”,长度:9->“ABCDEFG9”,实际长度:8与计算长度:8
“ABCDEFGH%d”,长度:10->“ABCDEFGH10”,实际长度:10与计算长度:10
“ABCDEFGHI%d”,长度:11->“ABCDEFGHI 11”,实际长度:11与计算长度:11
“ABCDEFGHIJ%d”,长度:12->“ABCDEFGHIJ12”,实际长度:12与计算长度:12

如何“不工作”?为什么不能设置变量?len(string)将在string=“This is…”之前处理,因此无法给出任何结果。这是理解编程的糟糕方式……是的,使用变量x=len(string)更有意义。但我想知道不使用变量是否可能。如果是这样,那么%d的值将存储在何处。当您获得足够高的声誉时,也可以进行追加投票。;-)