почему пробелы в кортеже Python имеют значение? - PullRequest
2 голосов
/ 26 сентября 2011

Я получаю странные результаты и, наконец, заметил, что моя привычка помещать пробелы в кортеж вызывает проблему. Если вы можете воспроизвести эту проблему и сказать мне, почему она работает таким образом, вы бы спасли то, что осталось от моих волос. Спасибо!

jcomeau@intrepid:/tmp$ cat haversine.py
#!/usr/bin/python
def dms_to_float(degrees):
 d, m, s, compass = degrees
 d, m, s = int(d), float(m), float(s)
 float_degrees = d + (m / 60) + (s / 3600)
 float_degrees *= [1, -1][compass in ['S', 'W', 'Sw']]
 return float_degrees

jcomeau@intrepid:/tmp$ python
Python 2.6.7 (r267:88850, Jun 13 2011, 22:03:32) 
[GCC 4.6.1 20110608 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from haversine import *
>>> dms_to_float((111, 41, 0, 'SW'))
111.68333333333334
>>> dms_to_float((111,41,0,'Sw'))
-111.68333333333334

С пробелами в кортеже ответ неверный. Без ответа правильный.

Ответы [ 2 ]

12 голосов
/ 26 сентября 2011

Пробелы не должны иметь значения.Разница обусловлена ​​случаем: SW против Sw.

Вы не проверяете SW здесь:

compass in ['S', 'W', 'Sw']] 

Возможно, измените его на:

compass.upper() in ['S', 'W', 'SW']] 
0 голосов
/ 26 сентября 2011

Предполагая, что «градусы» относятся к градусам широты или долготы, я не могу себе представить, почему «SW» рассматривается как жизнеспособный вариант. Широта - это N или S. Долгота - это E или W. Пожалуйста, объясните.

Исходя из вашей выборки размера 1, пользовательский ввод нельзя доверять. Попробуйте проверить ввод или, по крайней мере, убедиться, что фиктивный ввод вызовет исключение. Вы, кажется, любите однострочники; попробуйте это:

float_degrees *= {'n': 1, 's': -1, 'e': 1, 'w': -1}[compass.strip().lower()]
...