2013-11-29 4 views
2

я должен создать таблицу в формате: {str: list of str}Python Help: Создание Dict из {ул: список ул} из CSV-файла

Открытие файла в формате CSV, используя следующий код, я получаю:

import csv 
cr = csv.reader(open("name.csv","r")) 
for row in cr: 
    print(row) 

выход:

['key1', 'key2', 'key3'] 
['value1', 'value2', 'value3'] 
['value4', 'value5', 'value6'] 

Я по существу, необходимо структурировать это в формате

{'key1': ['value1', 'value4'], 'key2': ['value2', 'value5'], 'key3': ['value3', 'value6']} 

Я застрял; Я просто не могу придумать способ сделать это для того, чтобы работать для любого количества ключей и значений

ответ

4

Используйте zip(), чтобы включить строки в столбцы, а затем сделать ту, в ключи словаря и значения:

import csv 

with open("name.csv", newline='') as infh: 
    cr = csv.reader(infh) 
    columns = {r[0]: list(r[1:]) for r in zip(*cr)} 

быстрая демонстрация последней строки:

>>> cr = [ 
...  ['key1', 'key2', 'key3'], 
...  ['value1', 'value2', 'value3'], 
...  ['value4', 'value5', 'value6'], 
... ] 
>>> {r[0]: list(r[1:]) for r in zip(*cr)} 
{'key3': ['value3', 'value6'], 'key2': ['value2', 'value5'], 'key1': ['value1', 'value4']} 

где cr стоит за csv.reader() объекта.

zip(*iterable) принимает все элементы в итерабельном и преобразует его как матрицу; столбцы становятся строками, поскольку каждое вложенное значение в пару со значениями из других строк в том же положении:

>>> zip(*[[1, 2, 3], [4, 5, 6]]) 
[(1, 4), (2, 5), (3, 6)] 

и ДИКТ понимании {key_expression: value_expression for targets in iterable} производят словарь, где в приведенном выше коды каждый первый элемент в столбце становится ключ, а остальное - значение.

+0

Просто отметим, что на Python 2.6 и ниже просто замените последнюю строку на 'column = dict (zip (r [0], list (r [1:]) для r в zip (* cr)))' , Я удалил свой ответ и поддержал это, потому что я неправильно понял вопрос в своей спешке, чтобы ответить. –

+0

@ChinmayKanchi: Поскольку OP использует 'print()' как функцию, я думаю, мы можем предположить, что мы смотрим на Python 3 здесь. –

+0

Извините за поздний ответ, но как бы вернуть значение из приведенного выше кода в оболочке python? я использовал ваш код, но когда я добавляю: print (cr) он возвращает: <_csv.reader object at 0x02EC59B0>, также ваша демо использовала список списков, поэтому я не мог применить ее к моей проблеме. – user3050527