Как я могу преобразовать строку списка в число с плавающей точкой - PullRequest
0 голосов
/ 26 октября 2018

Я использую черепаху Питона, чтобы наметить путь урагана Ирмы.После прочтения файла и получения полезных данных (широта, долгота и скорость ветра) я получал ошибки о том, что секция отображения кода не может принимать строки.Но когда я попытался преобразовать значения списка в float, это выдает мне ValueError: не удалось преобразовать строку в float: '.'.Я пытался использовать .split, но затем я получаю сообщение об ошибке: недостаточно значений для распаковки.

#open the file and extract the data
    with open("irma.csv", 'rt') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            latitude = row["Lat"]
            longitude = row["Lon"]
            windspeed = row["Wind"]

#convert to float
    latitude = [float(i) for i in latitude]
    longitude = [float(i) for i in longitude]

#mapping the data to the Python turtle function
    for lat, lon in latitude, longitude:
        t.setpos(lat, lon)
        for index in windspeed:
            if index < 74:
                t.pencolor("White")
                t.width(2)
            elif 74 <= index <= 95:
                t.pencolor("Blue")
                t.width(4)
            elif 96 <= index <= 110:
                t.pencolor("Green")
                t.width(6)
            elif 111 <= index <= 129:
                t.pencolor("Yellow")
                t.width(8)
            elif 130 <= index <= 156:
                t.pencolor("Orange")
                t.width(10)
            elif windspeed >= 157:
                t.pencolor("Red")
                t.width(12)

Ответы [ 2 ]

0 голосов
/ 26 октября 2018
latitude = [float(i) for i in latitude]

Проблема с этой строкой. latitude начинается со строки, например "100.5". Когда вы делаете [float(i) for i in latitude], Python перебирает каждый символ в этой строке и пытается преобразовать его в число с плавающей точкой, эффективно выполняя:

latitude = [float("1"), float("0"), float("0"), float("."), float("5")]

Но float(".") терпит неудачу, потому что вы не можете преобразовать десятичную точку в число с плавающей точкой.

Я предполагаю, что вы действительно хотели, чтобы latitude начинался как список строк, который стал бы списком с плавающей точкой после выполнения этой строки. Если это так, то вам нужно изменить свой код для чтения csv. В настоящее время он присваивает строковые значения latitude, longitude и windspeed, при этом каждая итерация полностью перезаписывает все значения, которые были прочитаны в предыдущей итерации. Если вы хотите накапливать все значения без перезаписи, то вам нужно создать переменные в виде списков и добавить их.

latitude = []
longitude = []
windspeed = []
#open the file and extract the data
with open("irma.csv", 'rt') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        latitude.append(row["Lat"])
        longitude.append(row["Lon"])
        windspeed.append(row["Wind"])

Этого должно быть достаточно само по себе, но вы также можете удалить определения из списка с плавающей запятой и просто выполнить преобразование непосредственно в этом цикле. (И пока мы это делаем, давайте приумножим имена переменных, что обычно при работе со списочными данными)

latitudes = []
longitudes = []
windspeeds = []
#open the file and extract the data
with open("irma.csv", 'rt') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        latitudes.append(float(row["Lat"]))
        longitudes.append(float(row["Lon"]))
        windspeeds.append(float(row["Wind"]))
0 голосов
/ 26 октября 2018

Эта строка:

latitude = [float(i) for i in latitude]

перебирает КАЖДЫЙ символ в вашей широте, включая «.»который не может быть преобразован в плавающее.Та же проблема для долготы.

Вам не нужно понимание списка здесь.Просто:

latitude = float(latitude)

должно быть тем, что вы ищете, если объекты широты и долготы не содержат других символов.

Однако это не единственная ваша проблема.Ваш for row in reader цикл перезаписывает широту и долготу с каждым проходом.

Имея это в виду, подумайте над тем, чтобы использовать что-то вроде этого:

with open("irma.csv", 'rt') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        lat = float(row["Lat"])
        lon = float(row["Lon"])
        windspeed = row["Wind"]
        t.setpos(lat, lon)
        for index in windspeed:
            if index < 74:
                t.pencolor("White")
                t.width(2)
            elif 74 <= index <= 95:
                t.pencolor("Blue")
                t.width(4)
            elif 96 <= index <= 110:
                t.pencolor("Green")
                t.width(6)
            elif 111 <= index <= 129:
                t.pencolor("Yellow")
                t.width(8)
            elif 130 <= index <= 156:
                t.pencolor("Orange")
                t.width(10)
            elif windspeed >= 157:
                t.pencolor("Red")
                t.width(12)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...