2014-12-01 2 views
0

Я пытаюсь создать программу Google Ngram-esque в Python (проект CS-I). У меня есть файл CSV, который выглядит следующим образом:Ввод объектов в список в словарь

aardvark, 2007, 123948 
aardvark, 2008, 120423 
aardvark, 2004, 96323 
gorilla, 2010, 120302 
gorilla, 2008, 89323 
raptorjesus, 1996, 214 

Первое значение представляет собой слово, второй год мы рассчитываем число вхождений в, а третье числе вхождений.

У меня есть класс CountByYear, который принимает слово, год и частоту и возвращает объект CountByYear.

Мне нужно прочитать CSV-файл и распечатать словарь, содержащий слова в виде ключей со списками объектов CountByYear в качестве значений (без слов). Например:

{'aardvark': [CountByYear(year=2007, count=123948), CountByYear(year=2008...etc.], 'gorilla: [CountByYear(year=2010, count=120302), etc...)] 

Я зациклился на том, как я на самом деле должен получать год и рассчитывать для каждого объекта. Сейчас я делаю:

for line in f: 
    splitLine = line.strip().split(',') 
    words[splitLine[0]] = countList 
print(words) 

который печатает {aardvark': [], 'gorilla': [], 'raptorjesus': [], и это хорошо, потому что, по крайней мере я знаю, что я делаю словарную часть правильно. Но как заполнить эти пустые списки данными, которые я хочу?

+0

Вы не можете просто присваивать атрибуты класса 'count' и' year' и вызывать 'CountByYear.count', или я полностью недопонимаю? – 101

ответ

1

Вы не включают в себя пример класса CountByYear но указать это имеет конструктор, который принимает «слово» , "год" и "частота".

Предполагая, что определение, как это:

class CountByYear(object): 
    def __init__(self, word, year, frequency): 
     self.word = word 
     self.year = year 
     self.frequency = frequency 

    def __repr__(self): 
     return "CountByYear(year=%s, count=%s)" % (self.year, self.frequency) 

Вы можете сделать что-то вроде этого:

words = {} 
for line in f: 
    word,year,freq = [i.strip() for i in line.split(',')] 
    #create a new list if one does not already exist for this word 
    if not words.get(word): 
     words[word] = [] 
    #add this CountByYear object to corresponding list in the dictionary 
    words[word].append(CountByYear(word,year,freq)) 
print(words) 

Выход из приведенного выше кода на вашем примере входной файл будет:

{'gorilla': [CountByYear(year=2010, count=120302), CountByYear(year=2008, count=89323)], 'aardvark': [CountByYear(year=2007, count=123948), CountByYear(year=2008, count=120423), CountByYear(year=2004, count=96323)], 'raptorjesus': [CountByYear(year=1996, count=214)]} 
0

Один способ использования: defaultdict. Например,

from collections import defaultdict 

words = defaultdict(list) 

with open("data.csv", "r") as f: 
    for line in f.readlines(): 
     key_name, year, count = line.rstrip().split(',') 
     words[key_name] += [year, count] 
     # or words[key_name] += CountByYear(year, count) or similar 

print(words) 
+0

как есть + = используется здесь? это вызов .append() в списке по умолчанию (пустой)? Есть ли предпочтение использовать это вместо .append()? – lukevp

+0

Я использую 'defaultdict', а не регулярный dict. с 'defaultdict' синтаксис и добавление к словарям списков выглядит более интуитивно понятным. – Marcin

0

Попробуйте модуль csv (https://docs.python.org/3.4/library/csv.html) и что-то вроде

import csv 

words = {} 
with open('eggs.csv', newline='') as csvfile: 
    reader = csv.reader(csvfile, delimiter=' ', quotechar='|') 

    for word, year, count in reader: 
     words[word] = words.get(word, []) + [CountByYear(word, year, count)] 

print(words) 
Смежные вопросы