推荐学习书目
› 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
mzmxcvbn
V2EX  ›  Python

字典的键可以是一个范围吗?

  •  
  •   mzmxcvbn · Apr 9, 2018 · 4932 views
    This topic created in 3132 days ago, the information mentioned may be changed or developed.

    想做一个判断十六个风向的函数,输入角度,输出风向的字符串。感觉写十六个 if else 很不好,这个可以用字典做吗?或是其他什么方法?

    14 replies  •  2018-04-09 19:40:21 +08:00
    am241
    am241
    Apr 9, 2018 via Android
    1
    用除法
    ecnelises
    ecnelises
    Apr 9, 2018
    2
    如果这些范围都互相不重合的的话,你可以自己设计一个散列函数
    orangeD
    orangeD
    Apr 9, 2018
    3
    Guava 的 RangeMap 了解一下
    http://www.baeldung.com/guava-rangemap
    chairuosen
    chairuosen
    Apr 9, 2018
    5
    选范围中间值作为离散点,然后输入数据除以单位角度后四舍五入就行。
    zhengxiaowai
    zhengxiaowai
    Apr 9, 2018
    6
    看看我的 《 Python 如何传递运算表达式》

    https://hexiangyu.me/2018/04/02/pass-operation-expression/

    然后你就可以优雅的消除掉无脑 if-else 的写法

    ```
    >>> exp = Expression()
    >>> data = [1, 3, 4, 5, 6, 8, 9]
    >>> pick_range(data, 1 < exp, exp < 6)
    [3, 4, 5]
    >>> pick_range(data, 1 <= exp, exp < 6)
    [1, 3, 4, 5]
    >>> pick_range(data, 1 < exp, exp <= 6)
    [3, 4, 5, 6]
    >>> pick_range(data, 1 <= exp, exp <= 6)
    [1, 3, 4, 5, 6]
    >>>
    ```
    xomix
    xomix
    Apr 9, 2018❤️4
    7
    你这个做个 Enum 枚举不是更好吗…………
    lain0
    lain0
    Apr 9, 2018
    8
    可以類似這樣子嗎?

    horz, vert = cos(angle), sin(angle)

    horz_desc = ''
    if abs(horz) > some_threshold:
    horz_desc = 'east' if horz > 0 else 'west'

    vert_desc = ''
    if abs(vert) > some_threshold:
    vert_desc = 'north' if vert > 0 else 'south'

    return ' '.join([vert_desc, horz_desc])
    RuiQ
    RuiQ
    Apr 9, 2018
    9
    In [18]: from bisect import bisect

    In [19]: def windy(angle, base=[0,90,180,270,360], name="/北风 /东风 /南风 /西风"):
    ...: i = bisect(base, angle)
    ...: return name.split('/')[i]
    ...:

    In [20]: windy(0)
    Out[20]: '北风'

    In [21]: windy(90)
    Out[21]: '东风'

    In [22]: windy(15)
    Out[22]: '北风'

    In [23]: windy(100)
    Out[23]: '东风'

    In [24]: windy(200)
    Out[24]: '南风'

    In [25]: windy(280)
    Out[25]: '西风'
    wizardforcel
    wizardforcel
    Apr 9, 2018 via Android
    10
    @zhengxiaowai 你这不就是 np.where 么。。。
    zhongkouwei
    zhongkouwei
    Apr 9, 2018
    11
    就用除法呗
    Magentaize
    Magentaize
    Apr 9, 2018 via Android
    12
    字典并不限制你是一个非单射映射
    jadec0der
    jadec0der
    Apr 9, 2018
    13
    这个帖子在 1L 就该结束了…
    Building
    Building
    Apr 9, 2018 via iPhone
    14
    难以想象当你需要计算时间的时候又会提出什么提问...
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3244 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 10:32 · PVG 18:32 · LAX 02:32 · JFK 05:32
    ♥ Do have faith in what you're doing.