2016-08-11 54 views
-1

昨天我的應用程序的這一部分工作,我似乎無法找出爲什麼它現在不工作。有條件地重新格式化字符串時出錯

這裏是它應該做的:

輸入:10th ave 501

輸出:501 10th ave

的代碼塊應該尋找所謂patterns在列表中的目標詞之一,而如果後面有一個len <= 4,將它移動到字符串的前面。 patterns包含文字如ave, street, road, place

這裏是我的代碼:

address = address.split(' ') 
for pattern in patterns: 
    try: 
     if address[0].isdigit(): 
      continue 
     location = address.index(pattern) + 1 
     number_location = address[location] 
     if 'th' in address[location + 1] or 'floor' in address[location + 1] or '#' in address[location]: 
      continue 
    except (ValueError, IndexError): 
     continue 
    if number_location.isdigit() and len(number_location) <= 4: 
     address = [number_location] + address[:location] + address[location+1:] 
     break 
address = ' '.join(address) 

print address 

目前輸出僅僅是完全相同的爲我輸入。即10th ave 501正在返回10th ave 501。我覺得這是相當明顯的,我看了一眼。

+1

爲了讓您更容易理解您的代碼,只需將一種類型的數據放入一個單一的變量名稱。例如,你將'address'作爲一個字符串並且也作爲一個列表('address = address.split('')')。 – dsh

+0

501的長度不能小於或等於4? – Harrison

+0

@哈里森如果這不是家庭作業,你想解決街道正常化的問題,也許這個[包](https://github.com/openvenues/pypostal)可以幫你解決 – BPL

回答

0

'10th'.isdigit()False因爲:

返回true,如果字符串中的所有字符是數字(source

如果你願意,你可以檢查的第一個字符:

if number_location[0].isdigit() and len(number_location) <= 4: 
+0

有道理。這應該處理正確的地址也通過應用程序的情況,例如'501 10th ave'。我能做些什麼來處理所有情況?我的意思是如果一個地址已經以#開頭,那麼它會通過,但其他任何東西都會被測試。 – Harrison

+0

我不確定所有的情況。你需要自己定義所有選項,然後解決。 –