【问题标题】:Why dictionary generator doesn't work correctly为什么字典生成器不能正常工作
【发布时间】:2021-09-29 21:18:36
【问题描述】:

我需要读取 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 中,而这一行是文件的最后一行。请帮助我

【问题讨论】:

  • 您的意思是len(line) 而不是len(self.raw_data)?否则,您将在循环中一遍又一遍地使用相同的键。否则,如果这只是一个索引,则没有理由将 dict 存储在 list 中,您可以稍后使用 enumerate 获取每个元素的 (index,value)
  • 只有一个字典键 (len(self.raw_data)) 被写入。为什么会期望看到更多的键?
  • @CoryKramer:len(line) 也没有任何意义。可能有 2 行长度相同

标签: python dictionary generator


【解决方案1】:

len(self.raw_data) 在开始时被评估并且在 dict 理解内不会改变。只需使用普通循环或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))}

【讨论】:

  • 正如我在 cmets 中提到的,如果键只是索引,则根本不需要 dict,只需存储在 list 中即可。他们稍后可以enumerate 获取每个元素的索引和值
猜你喜欢
  • 2021-12-09
  • 2023-02-02
  • 2016-07-16
  • 2019-01-04
  • 2020-09-03
  • 2016-10-10
  • 2016-10-24
  • 2017-02-27
  • 2017-07-08
相关资源
最近更新 更多