2016-01-30 67 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