2013-09-17 3 views
1

Я пытаюсь создать словарь, содержащий внутри него вложенный список.Проблемы с Python-словарями и вложенными списками

Цель будет иметь это быть:

key : [x,y,z] 

Я потянув информацию из файла CSV и подсчета количества раз некий ключ показывает в каждом столбце. Однако я получаю ошибку ниже

> d[key][i] = 1 
KeyError: 'owner' 

В случае, если владельцем является название моей колонки.

if __name__ == '__main__': 
    d = {} 
    with open ('sample.csv','r') as f: 
     reader = csv.reader(f) 
     for i in range(0,3): 
      for row in reader: 
       key = row[0] 
       if key in d: 
        d[key][i] +=1 
       else: 
        d[key][i] = 1 

    for key,value in d.iteritems(): 
     print key,value 

Что я подправить в этом цикле, чтобы он создать ключ, если он не существует, а затем добавить к нему, если он делает?

ответ

4

Проблема в том, что вы пытаетесь использовать список ([i]), где нет списка.

Таким образом, вы должны заменить

d[key][i] = 1 

с

d[key] = [0,0,0] 
d[key][i] = 1 

Это первый создать список с тремя элементами (так что вы можете использовать [0], [1] и [2] потом без ошибок), а затем присваивает один - к правильной записи в списке.

+0

Это решило проблему ошибки, поэтому я принял его, однако мой цикл не добавляя к любому элементу массива за пределами из first – Alex

+0

@Alex Это потому, что вы должны заменить это: 'd [key] [i] = 1' с этим' d [key] [i] + = 1' – smac89

+0

Я не знаю, правильно ли я вас понимаю. Но у вас есть один внешний цикл (для i в диапазоне (0,3): ') с наборами' i' сначала до 0, затем 1, а затем 2. Внутренний цикл итерации по строкам и добавление использует первую запись этого строка, чтобы добавить один список, указанный сам по себе ('key'), но там в записи, обозначенной буквой' i'. Потому что это все немного сложно, я думаю, вам следует внимательно проверить свой код, если вам не нужно менять порядок циклов или даже удалять внешний. Пожалуйста, напишите, если я неправильно понял ваш код или ваш вопрос. – TobiMarg

0

Используйте попытку, поймать блок, чтобы добавить список в новый ключ, затем увеличить при необходимости

if __name__ == '__main__': 
    d = {} 
    with open ('sample.csv','r') as f: 
     reader = csv.reader(f) 
     for i in xrange(0,3): 
      for row in reader: 
       key = row[i] 
       try: d[key][i] += 1 
       except KeyError: 
        d[key] = [0, 0, 0] 
        d[key][i] = 1 

    for key,value in d.iteritems(): 
     print key,value 
2

Вы можете использовать defaultdict:

from collections import defaultdict 

ncols = 3 
d = defaultdict(lambda: [0 for i in range(ncols)]) 
0

Использование defaultdict и счетчик, вы можете придумать с диктоном, который позволяет вам легко измерить, сколько раз ключ появился в позиции (в данном случае 1-й, 2-й или 3-й, срезом)

csv = [ 
    ['a','b','c','d'], 
    ['e','f','g', 4 ], 
    ['a','b','c','d'] 
] 

from collections import Counter, defaultdict 

d = defaultdict(Counter) 

for row in csv: 
    for idx, value in enumerate(row[0:3]): 
     d[value][idx] += 1 

Пример использования:

print d 
print d['a'][0] #number of times 'a' has been found in the 1st position 
print d['b'][2] #number of times 'b' found in the 3rd position 
print d['f'][1] #number of times 'f' found in 2nd position 
print [d['a'][n] for n in xrange(3)] # to match the format requested in your post 

defaultdict(<class 'collections.Counter'>, {'a': Counter({0: 2}), 'c': Counter({2: 2}), 'b': Counter({1: 2}), 'e': Counter({0: 1}), 'g': Counter({2: 1}), 'f': Counter({1: 1})}) 
2 
0 
1 
[2, 0, 0] 

Или поместить в функцию:

def occurrences(key): 
    return [d[key][n] for n in xrange(3)] 

print occurrences('a') # [2, 0, 0] 
Смежные вопросы