刚开始学 Python,遇到个问题搞不懂,求指点下

2016-09-01 23:53:33 +08:00
 Cursive

字符串转数字的函数:

from functools import reduce
    def str2int(s): 
        def fn(x, y): 
            return x * 10 + y 
        def char2num(s): 
            return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
        return reduce(fn, map(char2num, s))

{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]

如果的 s 是 '1' , '2' 这种单个字符,还能理解,这是取词典的键值 可是如果 s 是 '1234' , '1990' 这种的多个字符的字符串,就搞不懂了

求指点下

4913 次点击
所在节点    Python
31 条回复
Cursive
2016-09-01 23:54:48 +08:00
晕,不会贴代码...
Cursive
2016-09-01 23:58:55 +08:00
@Cursive 弄错符号了...
kely
2016-09-02 00:05:15 +08:00
是一个字符一个字符迭代的
sherlocktheplant
2016-09-02 00:13:29 +08:00
我又来半桶水了 这里 map 是把字符串中每个字符遍历一遍 对每个字符做一次 char2num 操作 最后把每次 char2num 操作的结果全部放到同一个数组里返回
然后作为参数传给 reduce
recude 又把每个值依次乘以 10 再加上去 还原成对应的整数
prondtoo
2016-09-02 00:39:02 +08:00
同半桶水,例如输入的是 12345 , map(char2num, s)以后,得出的就是[1,2,3,4,5]
最后就 reduce(lambda x,y:x*10+y,[1,2,3,4,5])
Lonely
2016-09-02 00:42:17 +08:00
你不要把两个 s 搞混了啊
prondtoo
2016-09-02 00:42:55 +08:00
最后就( 1*10+2 )*10+3 )*10+4 )*10+5 ))
myjiayan
2016-09-02 00:44:55 +08:00
换个写法 str2int = lambda s:sum(int(v)*10**i for i, v in enumerate(s[::-1]))
kamen
2016-09-02 00:47:24 +08:00
@prondtoo 你的思路完全正确,虽然我还没看楼主的代码
kamen
2016-09-02 00:48:33 +08:00
map 和 reduce 是神器,楼主要多用,多看
eloah
2016-09-02 01:32:48 +08:00
因为 map()是对一个 iterable 的对象的 item 进行操作的,而 string 就是可 iterable 的,其中每一个字符一个 item.
其实理解成 C 中的 char[]这样就好理解了
markx
2016-09-02 01:49:11 +08:00
关键是 map 。
Allianzcortex
2016-09-02 07:05:02 +08:00
原理不难,函数式编程范畴,但==,为什么 char2num 不直接用 int()。。
Cursive
2016-09-02 07:19:37 +08:00
@Lonely 就是卡到这里了, char2num(s) 的参数 s 和 return 返回中的 [s] ,在这里绕不过弯...卡死了
Cursive
2016-09-02 07:37:06 +08:00
重新看了一遍 map 函数,大概懂了,多谢各位了~
aeshfawre
2016-09-02 07:54:50 +08:00
搞这么复杂,这种写法对比 int 转换有啥优点呢?
Allianzcortex
2016-09-02 09:00:32 +08:00
@myjiayan 有点厉害!!
hitmanx
2016-09-02 09:56:20 +08:00
@Allianzcortex 你再想想
Cursive
2016-09-02 09:58:17 +08:00
@aeshfawre 不是复杂不复杂的问题。在学 Python ,这是一个例子中的代码,之前没看这段代码的作用
hitmanx
2016-09-02 10:02:27 +08:00
@Allianzcortex 不好意思,试了一下,是我想错了。用 int 在 python 里是成立的,在 c 里是不行的,等于是把 ascii(char)转为(int)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/303349

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX