所以我目前有一个为输入高度输出声障的功能。
def soundbarier (y):
if 0 < y < 1524:
S = 340.3
elif 1524 < y < 3048:
S = 334.4
elif 3048 < y < 4572:
S = 328.4
elif 4572 < y < 6096:
S = 322.2
elif 6096 < y < 7620:
S = 316.0
elif 7620 < y < 9144:
S = 309.6
elif 9144 < y < 10668:
S = 303.6
elif 10668 < y < 12192:
S = 295.4
else:
S = 294.5
return (float(S))
我想用字典缩短它,但我不能让它工作。
def SOUND(y):
return {
0 < float(y) < 1524: 340.3,
1524 < y < 3048: 334.4,
3048 < y < 4572: 328.4,
4572 < y < 6096: 322.2,
6096 < y < 7620: 316.0,
7620 < y < 9144: 309.6,
9144 < y < 10668: 303.6,
10668 < y < 12192: 295.4
}.get(y, 9)
print(SOUND(1500))
我真的不想要任何默认值。我怎么能让它工作?我基本上需要函数为范围内的某个Y输出S.
答案 0 :(得分:2)
consts = [340.3, 334.4, 328.4, 322.2, 316.0, 309.6, 303.6, 295.4, 295.5]
def soundbarrier(y):
return consts[
-1 if (not (0 < y < 12192) or y % 1524 == 0) else y // 1524
]
In [1]: soundbarrier(1500)
Out[1]: 340.3
In [2]: soundbarrier(10000)
Out[2]: 303.6
In [3]: soundbarrier(100)
Out[3]: 340.3
In [4]: soundbarrier(1524)
Out[4]: 295.5
答案 1 :(得分:2)
没有内置语法,但您可以使用'bisect'有效地实现它,它会在列表中找到一个数字的位置。
def soundbar(y):
barrier_dict = {
1524: 340.0,
3048: 334.4,
4572: 328.4,
float('inf'): 0
}
height, barrier = zip(*sorted(barrier_dict.items()))
return barrier[bisect(height, y)]
print 1000, '->', soundbar(1000)
print 2000, '->', soundbar(2000)
print 2500, '->', soundbar(2500)
print 10000, '->', soundbar(10000)
输出:
1000 -> 340.0
2000 -> 334.4
2500 -> 334.4
10000 -> 0
答案 2 :(得分:1)
一般的解决方案是将numpy.digitize
与字典结合使用。
请注意,这并不能处理输入在边界上的边缘情况,在这种情况下floating point approximations可能需要特别注意。
import numpy
def SOUND(y):
bins = np.array([0, 1524, 3048, 4572, 6096, 7620, 9144, 10668, 12192])
values = np.array([340.3, 334.4, 328.4, 322.2, 316.0, 309.6, 303.6, 295.4])
d = dict(enumerate(values, 1))
return d[int(np.digitize(y, bins))]
SOUND(7200) # 316.0
答案 3 :(得分:0)
您的代码的问题是python会将字典中的键评估为True / False。
如何创建映射表(即元组字典到值)如下:
sound_barrier = { (0, 1524): 340.3, (1524, 3048): 334.4, (3048, 4572): 328.4, ... }
def get_mapping(table, value):
for k in table:
if k[0] < value < k[1]:
return table[k]
get_mapping(sound_barrier, 2000)