我有一个字符串列表列表,我希望将数字转换为文本等价物。例如。 2到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]
答案 0 :(得分:2)
您有list
个list
,而不是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 :(得分:2)
首先尝试创建一个展平的列表result
,即其中没有嵌套列表(如果有的话)。然后使用列表项的评估(如果它是int
或long
使用isdigit()
函数)并使用literal_eval
,然后传递给函数num2words
,因为{ {1}}预计num2words
不是int
。
str
N.B.如果您想保留其他所有字词,请更改
此
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
到
else:
pass
答案 2 :(得分:-1)
该特定错误的原因是因为您的结果数组实际上是一个数组数组。
所以说像
for item in result:
r=num2words(item)
项目实际上是
['nn', 'known', 'tsutsumi', 'father', 'yasujiro', 'sow', 'seed', 'family', 'dominion']
你的选择要么是把它压平成单维数组,要么是有嵌套的for循环,就像这样(或者使用嵌套列表理解,如上所述):
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