2014-02-24 62 views
2

如何在不使用變量的情況下查找下面的字符串的長度?在字符串中使用len()

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

print string 

這一個不起作用。什麼是正確的編碼方式?

+1

*如何*「沒有[它]工作」? – user2864740

+0

爲什麼不能設置一個變量? len(字符串)將在string =「This is ...」之前被處理,所以沒有結果可以被髮出 – linpingta

+0

這是理解編程的不好的方法... – thavan

回答

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 
+0

很棒.. @ martineau – san1512

+0

當你贏得了足夠高的聲望時,加票也會很好。 ;-) – martineau

+1

你確定.. @馬蒂諾 – san1512

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?誰知道。

2

在你的句子找你想分配給它的任何值之前評估串lenght

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

你應該考慮它有可能做到這一點,即:

string = "%d chars.." 

可以擴大平等地

string = "9 chars.." 

並致:

string = "10 chars.." 
0

實際上這不起作用,因爲字符串在賦值之前被引用。 除此之外,這將永遠不會按設計工作,因爲在轉換意義上,您正在創建遞歸。你試圖得到一個字符串的長度取決於字符串本身長度的長度(咦?) 爲了解決這樣的問題,人們可以(!)解決iterativelly:

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

通過選擇適當的採樣函數,可以解決這個問題。

0

這基本上是一個常數,你說的方式。

如果它是部分變量,您只需要一個常數,它反映了不會改變的部分,例如, len("This sentence has") + len("characters")

在發佈這樣的字符串之前,可以簡單地評估變量部分。此時,添加了常數部分的len(string)將產生正確的答案。

有時,答案並不需要(多)代碼:-)

相關問題