Почему генератор словарей работает неправильно

#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 простого хранения в a list , и вы можете использовать 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, просто храните в a list . Они могут позже enumerate получить индекс и значение каждого элемента