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
mzmxcvbn
V2EX  ›  Python

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

  •  
  •   mzmxcvbn · 2018-04-09 16:13:31 +08:00 · 3735 次点击
    这是一个创建于 2450 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    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  
       2018-04-09 17:34:53 +08:00
    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  
       2018-04-09 18:45:34 +08:00 via Android
    @zhengxiaowai 你这不就是 np.where 么。。。
    zhongkouwei
        11
    zhongkouwei  
       2018-04-09 19:15:15 +08:00
    就用除法呗
    Magentaize
        12
    Magentaize  
       2018-04-09 19:22:49 +08:00 via Android
    字典并不限制你是一个非单射映射
    jadec0der
        13
    jadec0der  
       2018-04-09 19:39:29 +08:00
    这个帖子在 1L 就该结束了…
    Building
        14
    Building  
       2018-04-09 19:40:21 +08:00 via iPhone
    难以想象当你需要计算时间的时候又会提出什么提问...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1144 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 23:18 · PVG 07:18 · LAX 15:18 · JFK 18:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.