2016-10-07 3 views
1

У меня есть данные, аналогичные приведенным ниже в файле:данных: Создание словаря словарей со списками в Python

Name, Age, Sex, School, height, weight, id 

Joe, 10, M, StThomas, 120, 20, 111 

Jim, 9, M, StThomas, 126, 22, 123 

Jack, 8, M, StFrancis, 110, 15, 145 

Abel, 10, F, StFrancis, 128, 23, 166 

Фактические данные могут быть 100 столбцов и миллион строк.

То, что я пытаюсь сделать, это создать Dict в следующей схеме:

school_data = {'StThomas': {'weight':[20,22], 'height': [120,126]}, 
       'StFrancis': {'weight':[15,23], 'height': [110,128]} } 

Что я пробовал:

  1. Испытание 1: (очень дорогой с точки зрения вычислений)

    school_names = [] 
    for lines in read_data[1:]: 
        data = lines.split('\t') 
        school_names.append(data[3]) 
    
    school_names = set(school_names) 
    
    for lines in read_data[1:]: 
        for school in schools: 
         if school in lines: 
          print lines 
    
  2. Испытание 2:

    for lines in read_data[1:]: 
        data = lines.split('\t') 
        school_name = data[3] 
        height = data[4] 
        weight = data[5] 
        id = data [6] 
        x[id] = {school_name: (weight, height)} 
    

Эти два метода, в которых я пытался действовать, но не приблизились к решению.

+0

Каковы другие столбцы? Являются ли они релевантными для вычислений или вы хотите сделать с этими дополнительными столбцами то же самое, что вы делали с весом/высотой (значения группы по Школе)? – Cadu

ответ

1

Самый простой способ сделать это в стандартной библиотеки с использованием существующих инструментов, csv.DictReader и collections.defaultdict:

from collections import defaultdict 
from csv import DictReader 

data = defaultdict(lambda: defaultdict(list)) # * 

with open(datafile) as file_: 
    for row in DictReader(file_): 
     data[row[' School'].strip()]['height'].append(int(row[' height'])) 
     data[row[' School'].strip()]['weight'].append(int(row[' weight'])) 

Обратите внимание, что пробелы в, например, ' School' и .strip() необходимы из-за пробелов в строке заголовка вашего входного файла. Результат:

>>> data 
defaultdict(<function <lambda> at 0x10261c0c8>, {'StFrancis': defaultdict(<type 'list'>, {'weight': [15, 23], 'height': [110, 128]}), 'StThomas': defaultdict(<type 'list'>, {'weight': [20, 22], 'height': [120, 126]})}) 
>>> data['StThomas']['height'] 
[120, 126] 

В качестве альтернативы, если вы планируете сделать дальнейший анализ, изучить что-то вроде pandas и его структура DataFrame данных.

* см Python defaultdict and lambda, если это кажется странным

+0

Отлично работает! Спасибо –

+0

@LaughingBuddha http://stackoverflow.com/help/someone-answers – jonrsharpe

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