2015-08-26 3 views
1

Я думаю, что у меня есть ошибка в моей установке python. Следующий код:Python случайным образом меняет данные Типы

i = 0 
while i < 100: 
    for key in F1Test.keys(): 

    mTest = np.append(mTest, float(F1Test[key])) 
    i = i+1 

будет работать для случайного числа раз, прежде чем он выходит из строя дает следующее сообщение об ошибке:

ValueError: could not convert string to float: error 

F1Test имеет следующие значения:

In [123]: F1Test 
Out[123]: 
{'AltoFlute': 0.75, 
'AltoSax': 1.0, 
'Bass': 0.9111111111111111, 
'BassClarinet': 0.8, 
'BassFlute': 0.8695652173913043, 
'BassTrombone': 'error', 
'Bassoon': 0.7692307692307692, 
'BbClarinet': 0.9230769230769231, 
'Cello': 0.8695652173913043, 
'EbClarinet': 0.9411764705882353, 
'Flute': 0.8695652173913044, 
'Guitar': 1.0, 
'Horn': 1.0, 
'Oboe': 0.8750000000000001, 
'Piano': 0.993103448275862, 
'SopSax': 0.9230769230769231, 
'TenorTrombone': 0.923076923076923, 
'Trumpet': 1.0, 
'Tuba': 0.888888888888889, 
'Viola': 0.8735632183908046, 
'Violin': 0.8974358974358975} 

я нашел его в более крупном коде и сводится к этой форме. По-видимому, раз в 50-й раз он будет читать значения из словаря как строки вместо поплавков. Я использую ipython 1.2.1, python 2.7.6 и Ubuntu 14.04.

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

+4

Похоже, он пытается преобразовать «ошибку» BassTrombone в поплавок и провалиться. – Ryan

+1

- значение 'F1Test [key]', которое является ошибкой, равным 'error'? – dm03514

+0

Вы оба правы. В расширенном коде F1Test получает повторный инициализацию для каждого цикла, и время от времени он должен получить ошибку. Мой глаз не поймал нитку. Думаю, пора прогуляться. Спасибо! –

ответ

2

F1Test[key] получает каждое значение из вашего Словаре, то вы бросили плавать с float(F1Test[key]), у вас есть строка в словаре "error" который вы пытаетесь литейным поплавок так, очевидно, это будет ошибкой. Нет никакого способа заставить код работать без ошибок, если не использовать try/except или какой-либо другой метод, чтобы поймать ввод, который нельзя отнести к поплавку.

На другой ноте все значения бар "error" уже поплавки так литья является излишним, вы также не должны вызывать .keys перебрать ключей Dict, for key in dict достаточно, и если вы просто хотите, чтобы значения использовать dict.values().

+1

Я знаю, я выбрал значения, чтобы получить исключение. В более крупном коде исключение исходило из среднего метода, вызываемого в массиве. Спасибо, что прочитали мой вопрос и указали это. Я заблокирован. –

+1

Не беспокойтесь, может быть время для перерыва;) –

Смежные вопросы