为什么Python中的以下while条件没有停止?

为什么Python中的以下while条件没有停止?,python,while-loop,Python,While Loop,我有一个位置,我想找到它的坐标。但是我的功能是将地址错误地解释为属于另一个国家。因此,我的逻辑是,不断从地址中逐个删除单词,直到返回的纬度和经度在正确的范围内(即,直到它正确解释地址) 为了说明这个问题,下面是代码: place = "*LORENZO GOMEZ & CO CPA'S RM 202 DON RAFAEL CASTILLO BLDG LEGASPI ST DAVAO CITY DAVAO DEL SUR PHILIPPINES" gmaps_geoencoder(plac

我有一个位置,我想找到它的坐标。但是我的功能是将地址错误地解释为属于另一个国家。因此,我的逻辑是,不断从地址中逐个删除单词,直到返回的纬度和经度在正确的范围内(即,直到它正确解释地址)

为了说明这个问题,下面是代码:

place = "*LORENZO GOMEZ & CO CPA'S RM 202 DON RAFAEL CASTILLO BLDG LEGASPI ST DAVAO CITY DAVAO DEL SUR PHILIPPINES"
gmaps_geoencoder(place)

>>> "{'results': [{'address_components': [{'long_name': 'San Diego', `'short_name': 'San Diego', 'types': ['locality', 'political']}, {'long_name': 'California', 'short_name': 'CA', 'types': ['administrative_area_level_1', 'political']}, {'long_name': 'United States', 'short_name': 'US', 'types': ['country', 'political']}, {'long_name': '92123', 'short_name': '92123', 'types': ['postal_code']}], 'place_id': 'ChIJAy3bGzT-24ARmX-IpDjdadk', 'types': ['doctor', 'establishment', 'health', 'point_of_interest'], 'formatted_address': '4715 Viewridge Avenue Suite 230, San Diego, CA 92123, San Diego, CA 92123, United States', 'geometry': {'location': {'lat': 32.8238366, 'lng': -117.119949}, 'location_type': 'GEOMETRIC_CENTER', 'viewport': {'southwest': {'lat': 32.8224876197085, 'lng': -117.1212979802915}, 'northeast': {'lat': 32.8251855802915, 'lng': -117.1186000197085}}}}], 'status': 'OK'}"`
正如我们所看到的,它将地址解释为属于美国,而实际上地址在菲律宾

但是,当我从地址中删除前几个字时,它会正确地解释它:

place = "RM 202 DON RAFAEL CASTILLO BLDG LEGASPI ST DAVAO CITY DAVAO DEL SUR PHILIPPINES"
gmaps_geoencoder(place)

>>> "{'results': [{'address_components': [{'long_name': 'Rafael Castillo', 'short_name': 'Rafael Castillo', 'types': ['administrative_area_level_5', 'political']}, {'long_name': 'Agdao', 'short_name': 'Agdao', 'types': ['political', 'sublocality', 'sublocality_level_1']}, {'long_name': 'Davao City', 'short_name': 'Davao City', 'types': ['locality', 'political']}, {'long_name': 'Davao del Sur', 'short_name': 'Davao del Sur', 'types': ['administrative_area_level_2', 'political']}, {'long_name': 'Davao Region', 'short_name': 'Davao Region', 'types': ['administrative_area_level_1', 'political']}, {'long_name': 'Philippines', 'short_name': 'PH', 'types': ['country', 'political']}], 'partial_match': True, 'types': ['administrative_area_level_5', 'political'], 'place_id': 'ChIJi4qcxTBs-TIRfnWnF4MGzDE', 'formatted_address': 'Rafael Castillo, Agdao, Davao City, Davao del Sur, Philippines', 'geometry': {'location': {'lat': 7.100270999999999, 'lng': 125.6382528}, 'bounds': {'southwest': {'lat': 7.095814, 'lng': 125.6311701}, 'northeast': {'lat': 7.1040211, 'lng': 125.644075}}, 'location_type': 'APPROXIMATE', 'viewport': {'southwest': {'lat': 7.095814, 'lng': 125.6311701}, 'northeast': {'lat': 7.1040211, 'lng': 125.644075}}}}, {'address_components': [{'long_name': 'Pelayo Street', 'short_name': 'Pelayo St', 'types': ['route']}, {'long_name': 'Poblacion District', 'short_name': 'Poblacion District', 'types': ['political', 'sublocality', 'sublocality_level_1']}, {'long_name': 'Davao City', 'short_name': 'Davao City', 'types': ['locality', 'political']}, {'long_name': 'Davao del Sur', 'short_name': 'Davao del Sur', 'types': ['administrative_area_level_2', 'political']}, {'long_name': 'Davao Region', 'short_name': 'Davao Region', 'types': ['administrative_area_level_1', 'political']}, {'long_name': 'Philippines', 'short_name': 'PH', 'types': ['country', 'political']}], 'partial_match': True, 'types': ['route'], 'place_id': 'ChIJJaE5cndt-TIRqYbFlmdcZP4', 'formatted_address': 'Pelayo St, Poblacion District, Davao City, Davao del Sur, Philippines', 'geometry': {'location': {'lat': 7.0685545, 'lng': 125.6068616}, 'bounds': {'southwest': {'lat': 7.0662803, 'lng': 125.6049452}, 'northeast': {'lat': 7.0718272, 'lng': 125.6078379}}, 'location_type': 'GEOMETRIC_CENTER', 'viewport': {'southwest': {'lat': 7.0662803, 'lng': 125.6049452}, 'northeast': {'lat': 7.0718272, 'lng': 125.6078379}}}}], 'status': 'OK'}")
因此,为了对其他此类错误识别的地址自动执行此过程(删除多少单词),我的代码如下:

place = "*LORENZO GOMEZ & CO CPA'S RM 202 DON RAFAEL CASTILLO BLDG LEGASPI ST DAVAO CITY DAVAO DEL SUR PHILIPPINES"
lat = 0
lon = 0
while ((lat not in range(4,21)) or (lon not in range(116,128))): # Philippines' latitude and longitude range
    place = place.split(' ', 1)[1]
    try:
        lat, lon, res = gmaps_geoencoder(place)
    except: # This is because sometimes the gmaps API does not return any result for a given address. In that case, remove the word at the beginning and search again.
        place = place.split(' ', 1)[1]
        lat, lon, res = gmaps_geoencoder(place)
但这会一直剥离单词,直到最后一个单词被剥离,并返回
列表索引超出范围的错误。当
lat
lon
在代码中指示的所需范围内时,while条件为什么不停止

编辑:修改
while
条件以始终保持运行,并添加
如果。。。中断
在达到所需条件时停止while循环,解决问题:

while True: 
    place = place.split(' ', 1)[1]
    try:
        lat, lon, res = gmaps_geoencoder(place)
    except:
        place = place.split(' ', 1)[1]
        lat, lon, res = gmaps_geoencoder(place)
    if (4<lat<21 or 116<lon<128):
        break
为True时:
地点=地点。分割(“”,1)[1]
尝试:
lat、lon、res=gmaps\U地理编码器(位置)
除:
地点=地点。分割(“”,1)[1]
lat、lon、res=gmaps\U地理编码器(位置)

如果(4因为在这种情况下只有几个字,也许你应该试着打印gmaps_编码器的输出,看看发生了什么?我认为你正确地删除了第一个字,那么当place=“RM 202 DON RAFAEL CASTILLO BLDG LEGASPI ST DAVAO CITY DAVAO DEL SUR Philippine”时,循环的输出是什么?

这不起作用的原因是lat和lon可以是非整数,而您只检查整数。请尝试以下操作:


<代码> >(不是4)p>看起来您的<代码> LAT和<代码> Lon < /C> >不是int,但是对于x范围(4/8),它类似于[4]、[5]、[6]和[7]中的代码> x,只考虑整数之间的相等性。


也许你想把while的条件从
lat不在范围(4,21)
改为
lat>21或lat你把它们转换成float了吗?我看到了你的gmaps\u地理编码器(位置)是一个长字符串。在
gmaps_geocoder
返回的3个变量中,
lat
lon
是浮点数,
res
是我在两个示例中展示的API返回的字符串。为什么您希望使用相同的
位置再次调用
gmaps_geocoder
。拆分(“”,1)[1]
使用相同的文字常量
place
可以得到与第一个不同的结果?只需让函数打印结果进行检查。它会从菲律宾返回正确的地址,但while循环不会停止。也许可以尝试打印lat和lon变量,看看它们是否在范围内,然后检查放置变量以查看它是否更改?是的,这样做了-它在正确的范围内。放置变量也会更改。
range
不会生成
列表(除非OP在Python 2.x中),它会生成
range
对象(它仍然包含完全相同的值,但只是懒洋洋地,它可以在
测试中执行
,只需执行算术而不是迭代所有值)。答案的要点似乎是正确的,但如果措辞不误导就更好了。我在问题的详细信息中添加了一个编辑,在这里我展示了一个解决问题的解决方案。这里的问题似乎不是由
int
range
引起的。你认为呢?或者这只是其中之一这只是“碰巧起作用”?好吧,你用if语句所做的就是检查应该放在while循环中的条件。while循环的工作就是完全按照你用if语句所做的去做。用if语句,循环基本上就像说“while True:”然后依靠内部的if语句来打破循环。如果while循环真的在工作,那么你就不需要把if语句放在那里。我已经在问题细节中添加了一个编辑,在这里我展示了一个解决问题的解决方案。这里的问题似乎不是由
int
range
引起的。你怎么办你认为?或者这只是“碰巧工作”的巧合之一?
break
只是停止while循环的另一种方法。因此,你的解决方案基本上与将while条件更改为
while not(4)相同
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]