2016-01-30 135 views
1

我有一個從中想要將數字轉換爲文本等價物的字符串列表。例如。 2兩個將數字轉換爲單詞

這是結果樣子:

[ 
    ['nn', 'known', 'tsutsumi', 'father', 'yasujiro', 'sow', 'seed', 'family', 'dominion'], 
    ['un', 'secretari', 'gener', 'kofi', 'annan', 'appoint', 'special', 'repres', 'iraq', 'help', 'improv', 'commun', 'iraqi', 'leader'], 
    ['year', '2016'] 
] 

這裏是我的代碼:

from num2words import num2words 

result=[] 
with open("./Stemmingg.txt") as filer: 
    for line in filer: 
     result.append(line.strip().split()) 

temp=[] 

for item in result: 
    r=num2words(item) 
    temp.append(r) 

然而,這給了我該說的錯誤:

TypeError: type(['nn', 'known', 'tsutsumi', 'father', 'yasujiro', 'sow', 'seed', 'family', 'dominion']) not in [long, int, float] 
+1

我沒有看到在'result'您提供... – Will

+0

任何符號,並且你的輸入總是一個列表列表,或者列表項只是一個簡單的字符串? – Will

+0

@ will:在整個*結果*中有一些數字,我只是舉一些例子來顯示* result *的樣子。輸入始終是列表的列表。 – minks

回答

2

首先嚐試創建一個扁平化,即在它裏面,如果沒有任何嵌套列表清單result。然後使用列表項的評價,如果它是(使用isdigit()功能intlong)號和傳遞給函數num2words因爲num2words之前使用literal_eval預計intstr

from num2words import num2words 
from ast import literal_eval 

result = [] 
with open("/Users/mr/Documents/Stemmingg.txt",'r') as filer: 
    for line in filer: 
     lst = line.strip().split()#split every line by spaces 
     for item in lst: 
      result.append(item.strip())#creating flattened list by appending item one by one 

temp=[]  
for item in result: 
    if item.isdigit():#check if int of long but not float 
     r=num2words(literal_eval(item))#using literal_eval to convert string to number 
     temp.append(r) 
    else: 
     pass 
print temp 

N.B.如果你想保持每換句話說然後更改

else: 
     pass 

else: 
     temp.append(item) 
+0

這沒有給我任何輸出。它也不打印* tmp *。只是掛起。 – minks

+0

已編輯,現在試試。 – SIslam

+0

我仍然沒有收到任何輸出。下面是該文件的樣子: *秋季需求油亞洲幫助削減averag價格每加侖常規gasolin單元狀態* * $ 1.08上個月$ 1.20 * *特異性地址十幾抗議* *部分告訴亞洲金融風暴影響歐洲economi * *需要90天* 他們都是不同的句子。 – minks

2

您有listlist s,不是str的列表。這將是一個天真的做法:

from num2words import num2words 
result=[] 
with open("/Users/mr/Documents/Stemmingg.txt") as filer: 
    for line in filer: 
     result.append(line.strip().split()) 

result = [[ 
    num2words(subitem) if isinstance(subitem, (int, float, long)) else subitem for subitem in item 
] for item in result] 

這是一個嵌套列表理解;有關這些工作方式的更多信息,請參閱here

現在,這仍然有一個問題!如果我有字符串'22',我們的isinstance()檢查失敗!所以我們可能需要一些額外的邏輯,與isdigit()的幫助:

def digitsToWords(item): 
    if isinstance(item, (int, float, long)): 
     return num2words(item) 

    if isinstance(item, (str, unicode)): 
     if item.isdigit(): 
      return num2words(int(item)) 

     if item.replace('.', '', 1).isdigit(): 
      return num2words(float(item)) 

    return item 

result = [[digitsToWords(subitem) for subitem in item] for item in result] 

如果你不想float秒值進行轉換來的話,這樣做,而不是:

def digitsToWords(item): 
    if isinstance(item, (int, long)): 
     return num2words(item) 

    if isinstance(item, (str, unicode)) and item.isdigit(): 
     return num2words(int(item)) 

    return item 

result = [[digitsToWords(subitem) for subitem in item] for item in result] 
-1

其原因具體錯誤是因爲你的結果數組實際上是一個數組數組。

所以說像

for item in result: 
    r=num2words(item) 

項目實際上是

['nn', 'known', 'tsutsumi', 'father', 'yasujiro', 'sow', 'seed', 'family', 'dominion']

你的項目,是指將其壓平成一維數組或有一個嵌套的循環選擇,像這樣(或者使用嵌套列表理解,如上面回答的那樣):

for arr in result: 
    for item in arr: 
     r=num2words(item) 

但是,你仍然有一個問題 - num2words必須採取一個數字。你的物品都不是數字(它們都是字符串)。既然你是從一個文件中解析出來的,你應該嘗試轉換成一個int類型的值,並且只有在它轉換的時候纔會進行轉換。因此,代碼會看起來像:

from num2words import num2words 
result=[] 
with open("/Users/mr/Documents/Stemmingg.txt") as filer: 
    for line in filer: 
     result.append(line.strip().split()) 

temp=[] 
for arr in result: 
    for item in arr: 
     try: 
      r=num2words(int(item)) 
      temp.append(r) 
     except: 
      pass