
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' 这种的多个字符的字符串,就搞不懂了
求指点下
1 Cursive OP 晕,不会贴代码... |
3 kely 2016-09-02 00:05:15 +08:00 via Android 是一个字符一个字符迭代的 |
4 sherlocktheplant 2016-09-02 00:13:29 +08:00 我又来半桶水了 这里 map 是把字符串中每个字符遍历一遍 对每个字符做一次 char2num 操作 最后把每次 char2num 操作的结果全部放到同一个数组里返回 然后作为参数传给 reduce recude 又把每个值依次乘以 10 再加上去 还原成对应的整数 |
5 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]) |
6 Lonely 2016-09-02 00:42:17 +08:00 via Android 你不要把两个 s 搞混了啊 |
7 prondtoo 2016-09-02 00:42:55 +08:00 最后就( 1*10+2 )*10+3 )*10+4 )*10+5 )) |
8 myjiayan 2016-09-02 00:44:55 +08:00 换个写法 str2int = lambda s:sum(int(v)*10**i for i, v in enumerate(s[::-1])) |
10 kamen nbsp; 2016-09-02 00:48:33 +08:00 via Android map 和 reduce 是神器,楼主要多用,多看 |
11 eloah 2016-09-02 01:32:48 +08:00 因为 map()是对一个 iterable 的对象的 item 进行操作的,而 string 就是可 iterable 的,其中每一个字符一个 item. 其实理解成 C 中的 char[]这样就好理解了 |
12 markx 2016-09-02 01:49:11 +08:00 关键是 map 。 |
13 Allianzcortex 2016-09-02 07:05:02 +08:00 via iPhone 原理不难,函数式编程范畴,但==,为什么 char2num 不直接用 int()。。 |
14 Cursive OP @Lonely 就是卡到这里了, char2num(s) 的参数 s 和 return 返回中的 [s] ,在这里绕不过弯...卡死了 |
15 Cursive OP 重新看了一遍 map 函数,大概懂了,多谢各位了~ |
16 aeshfawre 2016-09-02 07:54:50 +08:00 搞这么复杂,这种写法对比 int 转换有啥优点呢? |
17 Allianzcortex 2016-09-02 09:00:32 +08:00 @myjiayan 有点厉害!! |
18 hitmanx 2016-09-02 09:56:20 +08:00 @Allianzcortex 你再想想 |
20 hitmanx 2016-09-02 10:02:27 +08:00 @Allianzcortex 不好意思,试了一下,是我想错了。用 int 在 python 里是成立的,在 c 里是不行的,等于是把 ascii(char)转为(int) |
21 Allianzcortex 2016-09-02 10:18:08 +08:00 |
22 sudoz 2016-09-02 10:24:29 +08:00 看来是廖雪峰的教程 |
23 dongfang 2016-09-02 12:48:42 +08:00 第一,字符串是序列 第二, map(function,sequence)。注意到 map 要求第二个参数主要是序列就可以了。 map 会吧 function 作用到 sequence 的每一元素上。也就是 fn 会作用到字符串 s 的每一个字符上,并且返回一个 list |
24 hanbaobao2005 2016-09-02 13:03:05 +08:00 @Cursive 取 key ,为哈绕不过? 就相当于从字典里取值,字典的 key 就是 s ,值是 s 对应的 int 值 |
25 Cursive OP |
26 V5z6821l30fmhfx6 2016-09-02 14:44:19 +08:00 注意这一句: ``` map(char2num, s) ``` 这是 map 函数将字符串 s (例如'1234')的每一个字符都交给 char2num 函数转换,这不就是 map 函数的作用吗? 而 char2num 函数接收一个字符,返回一个数字,最后交由 reduce 函数把转换后的一个个数字组合成整数 |
27 necomancer 2016-09-02 22:48:33 +08:00 虽然没懂为什么不直接 int('1234') 完事。但是附上递归版的: ``` def str2num(s): if not s: return 0 return 10 * str2num(s[:-1]) + {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s[-1]] ``` |
28 necomancer 2016-09-02 22:49:40 +08:00 为什么没缩进…… def str2num(s): ....if not s: ........return 0 ....return 10 * str2num(s[:-1]) + {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s[-1]] 只好人工缩进了 |
29 bombless 2016-09-03 11:03:20 +08:00 如果不能脑补局部化的代码可以拿张纸遮住无关的, 233 另外初学就看 reduce 这样的方式工作的代码好么 233 ,感觉不懂编程的人初学直接看还好点,夹生的米就不容易煮熟了 |
30 necomancer 2016-09-03 15:22:17 +08:00 |
31 kittygirl0070 2016-09-19 13:48:42 +08:00 reduce 不需要了,直接用 sum 就可以了 |