我想编写一个函数,使用map和reduce将字符串转换为float。 (这里没有int())。 到目前为止,这是我的代码:
from functools import reduce
def str2float(s):
def char2number(s):
s = s.replace('.', '')
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] #here i try to get pure numbers
def find_digt(s):
return (len(s) - s.find('.') - 1) if ',' in s else 0
return reduce(lambda x, y: (10 * x + y), (map(char2number, s))) / pow(10, find_digt(s))
print(str2float('1456.124'))
所以在此之后,我收到一个错误:
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[sn] # [s] is the [key]
KeyError: ''
这意味着''不在dict中。我做了一些测试,如:
s = '1234.456'
s = s.replace(',', '')
print('' in s) #True
所以现在的问题是,一旦
s = s.replace('.', '')
''。'替换为'',它没有清除'。'在字符串中。
我想知道这里发生了什么。什么是清除字符串中的字符的正确方法,因为它是不可变的。
答案 0 :(得分:1)
我添加了一个简单的追踪声明:
def char2number(s):
print ("ENTER", s)
s = s.replace('.', '')
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
输出:
ENTER 1
ENTER 4
ENTER 5
ENTER 6
ENTER .
Traceback (most recent call last):
File "so.py", line 15, in <module>
print(str2float('1456.124'))
File "so.py", line 12, in str2float
return reduce(lambda x, y: (10 * x + y), (map(char2number, s))) / pow(10, find_digt(s))
File "so.py", line 7, in char2number
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] #here i try to get pure numbers
KeyError: ''
您将'1234.456'的个别字符传递给char2number
。当你传递点时,替换 将其清除,你留下一个空字符串。
我不确定你打算如何工作。您好像希望将整个字符串发送到支持函数。但是,map
适用于可迭代的元素序列。
至于更改字符串,你真的不能:你做了可以做的事情,将replace
的输出分配回原始字符串。你遇到的问题只是它在代码中的那一点上对一个字符进行操作。
答案 1 :(得分:1)
问题是您使用{em>未更改的输入字符串map
进行迭代,因为您只删除了.
函数中的char2number
。在功能之外,替换没有发生。
我建议找到位置并立即替换它:
from functools import reduce
def str2float(s):
pos_decimal_point = (len(s) - s.find('.') - 1) if '.' in s else 0
s = s.replace('.', '')
def char2number(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] #here i try to get pure numbers
return reduce(lambda x, y: (10 * x + y),
(map(char2number, s))) / pow(10, pos_decimal_point)
print(str2float('1456.124'))
答案 2 :(得分:1)
您有正确的想法,只需替换.
中的s
,然后转到您的map
函数:
map(char2number, s.replace('.',''))
注意:find_digt()
中有拼写错误,应显示为:if '.' in s...
。
如果您还想处理逗号,请添加一个额外的replace
来敲除它们:
stripped_s = s.replace('.','').replace(',','')
return reduce(lambda x, y: (10 * x + y), (map(char2number, stripped_s))) / pow(10, find_digt(s))
print(str2float('1,456.124'))
1456.124
完整代码:
def str2float(s):
def char2number(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
def find_digt(s):
return (len(s) - s.find('.') - 1) if '.' in s else 0
stripped_s = s.replace('.','').replace(',','')
return reduce(lambda x, y: (10 * x + y), (map(char2number, stripped_s))) / pow(10, find_digt(s))
print(str2float('1,456.124'))
1456.124