删除字符串中的字符,然后使用字典进行密钥匹配

时间:2017-05-17 01:23:05

标签: python string python-3.x dictionary

我想编写一个函数,使用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('.', '')

''。'替换为'',它没有清除'。'在字符串中。

我想知道这里发生了什么。什么是清除字符串中的字符的正确方法,因为它是不可变的。

3 个答案:

答案 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