#python #dictionary #generator
Вопрос:
Мне нужно прочитать CSV-файл и заполнить его данными из файла. Поэтому я написал один метод
def read_data(self):
with open('storage/data/heart.csv') as f:
self.raw_data = {
len(self.raw_data): {
'age':line[0],
'sex':line[1],
'cp':line[2],
'trtbps':line[3],
'chol':line[4],
'fbs':line[5],
'restecg':line[6],
'thalachh':line[7]
} for line in csv.reader(f)}
Но print(raw_data) возвращает это:
{0: {'age': '57', 'sex': '0', 'cp': '1', 'trtbps': '130', 'chol': '236', 'fbs': '0', 'restecg': '0', 'thalachh': '174'}}
Как вы можете видеть, мой метод сохраняет только 1 строку в dict, и эта строка является последней строкой из файла. Пожалуйста, помогите мне
Комментарии:
1. Вы имели в виду
len(line)
вместоlen(self.raw_data)
этого ? В противном случае вы снова и снова используете один и тот же ключ в своем цикле. В противном случае, если это просто должен быть индекс, нет причин дляdict
простого хранения в alist
, и вы можете использоватьenumerate
его позже, чтобы получить(index,value)
каждый элемент2. Записывается только один ключ dict (
len(self.raw_data)
). Почему можно ожидать увидеть больше ключей?3. @CoryKramer:
len(line)
это тоже не имеет смысла. Там может быть 2 строки одинаковой длины
Ответ №1:
len(self.raw_data)
оценивается с самого начала и не меняется внутри понимания диктанта. Просто используйте обычный цикл или enumerate
что-то в этом роде:
def read_data(self):
with open('storage/data/heart.csv') as f:
self.raw_data = {
i: {
'age':line[0],
'sex':line[1],
'cp':line[2],
'trtbps':line[3],
'chol':line[4],
'fbs':line[5],
'restecg':line[6],
'thalachh':line[7]
} for line in i, enumerate(csv.reader(f))}
Комментарии:
1. Как я уже упоминал в комментариях, если ключ-это просто индекс,
dict
то вообще не нужно a, просто храните в alist
. Они могут позжеenumerate
получить индекс и значение каждого элемента