在codewars上面的一道题目
http://ww2.sinaimg.cn/large/4de96cb8jw1eqwupijy5jj20ej0ch75i.jpg
我试图用lambda来解决,下面是我的code:
def alphabet_position(text):
return map(lambda char: ord(char)-ord('a') if char.isalpha(), text)
但是提示语法错误,实在不知道该如何解决,求指教。
1
aaaa007cn 2015-04-07 11:48:29 +08:00 1
|
4
xcv58 2015-04-07 12:01:19 +08:00 2
[ord(c) - 96 for c in a.lower() if c.isalpha()]
|
5
dongweiming 2015-04-07 12:06:30 +08:00 1
一行语句if需要有else
|
6
aaaa007cn 2015-04-07 12:19:52 +08:00 1
嗯,如上
错的地方不是 lambda 而是 conditional expressions 条件表达式或者说 ternary operator 三元运算符 另外还要处理大小写和非字母字符 比如 filter(lambda x: x, map(lambda c: ord(c)-ord('a')+1 if c.isalpha() else 0, text.lower())) 最后再 join 下 |
7
bugcoder OP @aaaa007cn
@Cynic222 @xcv58 @dongweiming return " ".join(filter(lambda x: x, map(lambda c: str(ord(c)-ord('a')+1) if c.isalpha() else '', text.lower()))) 的确是的,加了else就解决了,太感谢了~ 好多层嵌套啊,我再多研究研究。 |
8
bugcoder OP http://www.python-course.eu/lambda.php
结合这篇文章,感觉有点懂了,于是继续减少了一点代码,哈哈 先用filter过滤掉非字母: filter(lambda x: x.isalpha(), text.lower()) 然后用map转化为数字字符: map(lambda c: str(ord(c)-ord('a')+1), filter(lambda x: x.isalpha(), text.lower())) 最后再join起来: return " ".join(map(lambda c: str(ord(c)-ord('a')+1), filter(lambda x: x.isalpha(), text.lower()))) |
9
dongweiming 2015-04-07 14:01:01 +08:00
@bugcoder 这样快
' '.join(map(lambda c: str(ord(c)-ord('a')+1) if c.isalpha() else '', text.lower().replace(' ', ''))) |
10
dongweiming 2015-04-07 14:03:58 +08:00 1
|
11
Valyrian 2015-04-07 16:25:58 +08:00 1
没有else
|
12
hahastudio 2015-04-07 16:48:08 +08:00 1
其实 map 的必要性不大
alphabet_position = lambda text: " ".join(str(ord(c)-ord('a')+1) for c in filter(lambda x: x.isalpha(), text.lower())) a if b else c 就是 a ? b : c 我觉得一定又要有不少人批判 Python 的奇技淫巧了,因为我自己看着都别扭= = |
13
flyee 2015-04-07 23:31:59 +08:00 1
|
14
bugcoder OP |
15
bugcoder OP @hahastudio
其实我开始也是想实现这样的格式,只是当时还不知道用filter,这样我感觉比加了map的要更简单明了一些。 |