2015-12-08 3 views
0

Я попытался классифицировать числа в python от 0.0 до 1.0. Однако все числа получают условие else. Мне нужно каждое число, чтобы получить соответствующее условие, но даже когда число равно 0,3 или 0,2, получается последний бит. Что я делаю неправильно?Классификация чисел в python

#!/usr/bin/python 

import csv 
import sys 
import re 

bin1=0; 
bin2=0; 
bin3=0; 
bin4=0; 
bin5=0; 
bin6=0; 
bin7=0; 
bin8=0; 
bin9=0; 
bin10=0; 


def Read(): 
    with open (file_name) as csvfile: 
     readCSV = csv.reader (csvfile, delimiter=',') 
     for row in readCSV: 
      for num in range(1,2): 
       print row[num]     
       #Include in 10 bins 
       if 0.0 <= row[num] < 0.1: 
        bin1+=1; 
        print "bin1"; 
       elif 0.1 <= row[num] < 0.2: 
        bin2+=1; 
        print "bin2" 
       elif 0.2 <= row[num] < 0.3: 
        bin3+=1; 
        print "bin3" 
       elif 0.3 <= row[num] < 0.4: 
        bin4+=1; 
        print "bin4" 
       elif 0.4 <= row[num] < 0.5: 
        bin5+=1; 
        print "bin5" 
       elif 0.5 <= row[num] < 0.6: 
        bin6+=1; 
        print bin6; 
        print "bin6" 
       elif 0.6 <= row[num] < 0.7: 
        bin7+=1; 
        print bin7; 
        print "bin7" 
       elif 0.7 <= row[num] < 0.8: 
        bin8+=1; 
        print "bin8" 
       elif 0.8 <= row[num] < 0.9: 
        bin9+=1; 
        print "bin9" 
       else: 
        print "bin10" 


file_name = str(sys.argv[1]) 
print file_name 
Read() 

Что не так с этим простым классификатором?

Спасибо

Приветствия

ответ

3

Это неправильно, потому что вы читаете строки из файла CSV. когда вы сравниваете строку с номером, сравниваются имена их типов (!!!).

Решение: конвертировать row[num] в число, прежде чем сравнивать его с значениями с плавающей запятой.

+0

В качестве побочной заметки вам действительно не нужна первая часть '0.1 <= row [num] <0.2:' в любом из предложений 'elif'. Характер конструкции 'if-elif-else' гарантирует, что значение уже больше или равно 0,1 или другим значениям. Это по существу гарантирует, что первая часть всегда будет истиной. – Kendas

+0

@ Kendas: Хотя верно, я нахожу '0,3 <= num_as_float <0,4' более элегантным для чтения и избегает ошибок при перемещении блоков кода. – DainDwarf

1

Проблема в том, что row[num] - это строка, а не число. Поместите следующее в верхней части цикла:

val = float(row[num]) 

Затем используйте val вместо row[num] для любых числовых операций, в том числе сравнения.