推荐学习书目
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 · 4418 views
    This topic created in 2982 days ago, the information mentioned may be changed or developed.

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

    14 replies    2018-04-09 19:40:21 +08:00
    am241
        1
    am241  
       Apr 9, 2018 via Android
    用除法
    ecnelises
        2
    ecnelises  
       Apr 9, 2018
    如果这些范围都互相不重合的的话,你可以自己设计一个散列函数
    orangeD
        3
    orangeD  
       Apr 9, 2018
    Guava 的 RangeMap 了解一下
    http://www.baeldung.com/guava-rangemap
    chairuosen
        5
    chairuosen  
       Apr 9, 2018
    选范围中间值作为离散点,然后输入数据除以单位角度后四舍五入就行。
    zhengxiaowai
        6
    zhengxiaowai  
       Apr 9, 2018
    看看我的 《 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
        7
    xomix  
       Apr 9, 2018   ❤️ 4
    你这个做个 Enum 枚举不是更好吗…………
    lain0
        8
    lain0  
       Apr 9, 2018
    可以類似這樣子嗎?

    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
        9
    RuiQ  
       Apr 9, 2018
    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
        10
    wizardforcel  
       Apr 9, 2018 via Android
    @zhengxiaowai 你这不就是 np.where 么。。。
    zhongkouwei
        11
    zhongkouwei  
       Apr 9, 2018
    就用除法呗
    Magentaize
        12
    Magentaize  
       Apr 9, 2018 via Android
    字典并不限制你是一个非单射映射
    jadec0der
        13
    jadec0der  
       Apr 9, 2018
    这个帖子在 1L 就该结束了…
    Building
        14
    Building  
       Apr 9, 2018 via iPhone
    难以想象当你需要计算时间的时候又会提出什么提问...
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5298 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 71ms · UTC 09:20 · PVG 17:20 · LAX 02:20 · JFK 05:20
    ♥ Do have faith in what you're doing.