我正在开发一个邮资申请,需要根据多个邮政编码范围检查整数邮政编码,并根据邮政编码匹配的范围返回不同的代码.
每个代码都有多个邮政编码范围.例如,如果邮政编码在1000-2429,2545-2575,2640-2686范围内或等于2890,则应返回M代码.
我可以这样写:
if 1000 <= postcode <= 2429 or 2545 <= postcode <= 2575 or 2640 <= postcode <= 2686 or postcode == 2890:
return 'M'
Run Code Online (Sandbox Code Playgroud)
但这似乎是很多代码行,因为有27个可返回代码和77个总范围要检查.是否有更高效(并且最好更简洁)的方法使用Python将整数与所有这些范围匹配?
编辑:有很多优秀的解决方案,所以我已经实现了所有可能的解决方案,并对其性能进行了基准测试.
该程序的环境是一个Web服务(实际上是Django),它需要在运行中逐个检查邮政编码区域代码.那么,我的首选实现是可以快速用于每个请求的实现,并且不需要将任何进程保存在内存中,或者需要批量处理许多邮政编码.
我timeit.Timer使用随机生成的邮政编码每次使用默认的1000000次重复测试以下解决方案.
if 1000 <= postcode <= 2249 or 2555 <= postcode <= 2574 or ...:
return 'M'
if 2250 <= postcode <= 2265 or ...:
return 'N'
...
Run Code Online (Sandbox Code Playgroud)
1m代表的时间:5.11秒.
我脑子里更优雅,更容易进入和阅读范围.如果它们随时间变化特别好,这是可能的.但它的实施速度确实慢了四倍.
if any(lower <= postcode <= upper for (lower, upper) in [(1000, 2249), (2555, …Run Code Online (Sandbox Code Playgroud) python ×1