V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
bugcoder
V2EX  ›  Python

使用 lambda 的语法错误

  •  
  •   bugcoder ·
    ssword · 2015-04-07 11:42:00 +08:00 · 4053 次点击
    这是一个创建于 3500 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在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 条附言  ·  2015-04-07 12:55:34 +08:00
    多谢各位的指点,顺便参考了一下这篇博文:
    http://www.python-course.eu/lambda.php
    最后终于用自己能懂的方式解决问题了。

    ```python
    def alphabet_position(text):
    return " ".join(map(lambda c: str(ord(c)-ord('a')+1), filter(lambda x: x.isalpha(), text.lower())))
    print alphabet_position("this is a test")
    ```
    15 条回复    2015-04-08 04:25:42 +08:00
    bugcoder
        2
    bugcoder  
    OP
       2015-04-07 11:53:18 +08:00
    @aaaa007cn 我也看了一下有关lambda的语法,但是实在是第一次使用,感觉有点绕不明白了
    Cynic222
        3
    Cynic222  
       2015-04-07 11:56:38 +08:00   ❤️ 1
    @bugcoder 跟lambda无关,if-else错了
    xcv58
        4
    xcv58  
       2015-04-07 12:01:19 +08:00   ❤️ 2
    [ord(c) - 96 for c in a.lower() if c.isalpha()]
    dongweiming
        5
    dongweiming  
       2015-04-07 12:06:30 +08:00   ❤️ 1
    一行语句if需要有else
    aaaa007cn
        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 下
    bugcoder
        7
    bugcoder  
    OP
       2015-04-07 12:38:16 +08:00
    @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就解决了,太感谢了~
    好多层嵌套啊,我再多研究研究。
    bugcoder
        8
    bugcoder  
    OP
       2015-04-07 12:52:08 +08:00
    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())))
    dongweiming
        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(' ', '')))
    dongweiming
        10
    dongweiming  
       2015-04-07 14:03:58 +08:00   ❤️ 1
    @bugcoder 额已经不用判断了

    ' '.join(map(lambda c: str(ord(c)-ord('a')+1), text.lower().replace(' ', '')))
    Valyrian
        11
    Valyrian  
       2015-04-07 16:25:58 +08:00   ❤️ 1
    没有else
    hahastudio
        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 的奇技淫巧了,因为我自己看着都别扭= =
    flyee
        13
    flyee  
       2015-04-07 23:31:59 +08:00   ❤️ 1
    @dongweiming

    try `text = "a _ _ _ b"` with your code :)
    bugcoder
        14
    bugcoder  
    OP
       2015-04-08 04:21:57 +08:00
    @dongweiming
    @flyee
    恩,其实题目里面还要包含其他的非字母字符的,所以光空格还不够。
    bugcoder
        15
    bugcoder  
    OP
       2015-04-08 04:25:42 +08:00
    @hahastudio
    其实我开始也是想实现这样的格式,只是当时还不知道用filter,这样我感觉比加了map的要更简单明了一些。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5472 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 05:50 · PVG 13:50 · LAX 21:50 · JFK 00:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.