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

2018 年 4 月 9 日
 mzmxcvbn

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

4284 次点击
所在节点    Python
14 条回复
am241
2018 年 4 月 9 日
用除法
ecnelises
2018 年 4 月 9 日
如果这些范围都互相不重合的的话,你可以自己设计一个散列函数
orangeD
2018 年 4 月 9 日
Guava 的 RangeMap 了解一下
http://www.baeldung.com/guava-rangemap
araraloren
2018 年 4 月 9 日
chairuosen
2018 年 4 月 9 日
选范围中间值作为离散点,然后输入数据除以单位角度后四舍五入就行。
zhengxiaowai
2018 年 4 月 9 日
看看我的 《 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
2018 年 4 月 9 日
你这个做个 Enum 枚举不是更好吗…………
lain0
2018 年 4 月 9 日
可以類似這樣子嗎?

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
2018 年 4 月 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
2018 年 4 月 9 日
@zhengxiaowai 你这不就是 np.where 么。。。
zhongkouwei
2018 年 4 月 9 日
就用除法呗
Magentaize
2018 年 4 月 9 日
字典并不限制你是一个非单射映射
jadec0der
2018 年 4 月 9 日
这个帖子在 1L 就该结束了…
Building
2018 年 4 月 9 日
难以想象当你需要计算时间的时候又会提出什么提问...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/445395

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX