将数字转换为单词

时间:2016-01-30 04:34:33

标签: python list

我有一个字符串列表列表,我希望将数字转换为文本等价物。例如。 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]

3 个答案:

答案 0 :(得分:2)

您有listlist,而不是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,即其中没有嵌套列表(如果有的话)。然后使用列表项的评估(如果它是intlong使用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