2015-02-19 1 views
0
class Thing(object): 
    def __init__(self, array): 
    self.a = array[0] 
    self.b = array[1] 
    self.c = array[2] 

У меня есть список объектов Thing, каждый из которых имеет набор значений. Я пытаюсь вычислить гистограмма частотных распределений значений содержит в а, Ь, с, и поэтому у меня есть сценарий, который в основном делает:Использование строк, которые представляют переменную экземпляра в классе python для захвата значения

hist = dict() 
for t in things: 
    if t.a not in hist.keys(): 
     hist[s.a] = 0 
    else: 
     hist[s.a] += 1 

Однако, я хочу, чтобы иметь возможность обобщить код, так что у меня есть локальный dict, который хранит частоту a, а затем частоту b. Я могу сделать это очень легко в рубине, просто прочитав в CSV-файле (вот откуда появляются атрибуты Thing, я создал класс, потому что в прошлом у меня были проблемы с созданием скриптов, которые не поддаются последующим изменениям, потому что они так одноранговый.

f = File.open('trainingdatatostudents.csv') 
lines = f.readlines 
attributes = lines[0] 
attributes = attributes.split(",") 
records = [] 
1.upto(10).each {|num| 
    hist = Hash.new(0) 
    name = "" 
    lines.each {|line| 
     elements = line.split(",") 

     records.push(elements[num]) 
     hist[elements[num]] += 1 
    } 
    puts hist 
} 

Я знаю, что я могу использовать Dict переменный, которая есть в каждом экземпляре класса, но потом я просто имею значение как строки, и я не могу сделать что-то вроде s. «а» так, как мне это сделать?

Благодаря

+0

Пример входного файла и ожидаемого результата? – Marcin

ответ

0

это что-то вроде этого, что вы находясь в поиске?

>>> things = [Thing([1,2,3]), Thing([4,5,6]), Thing([1,4,3])] 
>>> things[0].__dict__ 
{'c': 3, 'a': 1, 'b': 2} 
>>> for t in things: 
    for att in t.__dict__: 
     getattr(t, att) 

Выход:

3 
1 
2 
6 
4 
5 
3 
1 
4 

Добавлено в, только ради полной ясности (я правильно Вас понял вы хотите гистограмму значений, хранящихся в атрибутах объекта Thing?) You может сделать

hist = [] 
for t in things: 
    for att in t.__dict__: 
     hist.append(getattr(t, att)) 

, а затем, чтобы не беспокоить себя использовать NumPy:

import numpy as np 
hist = np.hist(hist, bins=5) 
>>> hist 
(array([2, 1, 2, 2, 2]), array([ 1., 2., 3., 4., 5., 6.])) 

Первый массив - это высоты бункера, значения второго бункера. Или вы можете просто построить его непосредственно в функции matplotlib.pyplot hist.

0

Мне сложно понять, что вы ищете точно, но вы сказали, что можете сделать это очень просто в рубине. Вот тот же код, но в python:

import csv 
from collections import defaultdict 

with open('trainingdatatostudents.csv') as openfile: 
    reader = csv.reader(openfile) 
    headers = reader.readline() 
    records = [] 
    for i in range(10): 
     hist = defaultdict(lambda: 0) 
     for line in reader: 
      records.append(line[i]) 
      hist[records[i]] += 1 
     print hist 

Это тянет прямо от csv. Не уверен, куда вы собираетесь идти с информацией.

0
import csv 

def hasNumbers(inputString): 
    return any(char.isdigit() for char in inputString) 

class Student(object): 
    def __init__(self, line): 
     self.line = line 
     self.id = line[0] 
     self.ct = line[1] 
     self.ucsz = line[2] 
     self.ucsh = line[3] 
     self.ma = line[4] 
     self.sec = line[5] 
     self.bn = line[6] 
     self.bc = line[7] 
     self.nn = line[8] 
     self.m = line[9] 
     self.ok = line[10] 

    def __str__(self): 
     return "id: " + str(self.id) + ", ct: " + str(self.ct) + ", ucsz: " + str(self.ucsz) + ", ucsh: " + str(self.ucsh) + ", ma: " + str(self.ma) + ", sec: " + str(self.sec) + ", bn: " + str(self.bn) + ", bc: " + str(self.bc) + ", nn: " + str(self.nn) + ", m: " + str(self.m) + ", ok: " + str(self.ok) 

x = [] 
pp = "" 
with open('desk/trainingdatatostudents.csv') as f: 
    flag = False 
    reader = csv.reader(f) 
    for row in reader: 
     if flag is False: 
      pp = row 
      flag = True 
     else: 
      x.append(Student(row)) 
print pp 
q = [] 
count = 1 
for val in range(1,11): 
    hist = dict() 
    for s in x: 
     if hasNumbers(s.line[val]) and int(s.line[val]) not in hist.keys(): 
      hist[int(s.line[val])] = 0 
     elif hasNumbers(s.line[val]): 
      hist[int(s.line[val])] += 1 
    print(pp[count] + str(hist)) 
    count = count + 1 

Этот код делает то, что я хочу, просто хотел поделиться. Я просто решил дать моему ученику переменную экземпляра массива, и это просто облегчило мою жизнь.