转换数字为文字

2024-10-05 11:10:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串列表,我想从中把数字转换成文本等价物。二比二

结果如下:

[
    ['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']
]

这是我的代码:

^{pr2}$

但是,这给了我一个错误,它说:

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

Tags: 字符串文本列表数字nnfamilyunseed
3条回答

您有一个listlist,而不是{}s的列表。这将是一个幼稚的方法:

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',我们的^{}检查失败!所以我们可能需要一些额外的逻辑,在^{}的帮助下:

^{pr2}$

如果不想将floats转换为单词,请改为执行以下操作:

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]

这个特定错误的原因是因为结果数组实际上是数组数组。在

所以说

for item in result:
    r=num2words(item)

实际上

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

您可以选择将其展平为一个一维数组,或者有一个嵌套的for循环,就像这样(或者使用嵌套列表理解,如上所述):

^{pr2}$

但是,你仍然有一个问题num2单词必须取一个数字。你的项目都不是数字(它们都是字符串)。因为您是从一个文件进行解析的,所以您可能应该尝试将其转换为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

首先尝试创建一个列表result,它是扁平的,即如果有嵌套的列表,它里面没有嵌套的列表。如果列表项是number(intlong,则使用isdigit()函数)并在传递给函数num2words之前使用literal_eval,因为num2words期望{}不是{}。在

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.如果你想保持每隔一个单词,那么就改变

这个

^{pr2}$

else:
      temp.append(item)

相关问题 更多 >

    热门问题