大多数Pythonic方式将csv值读入列表的dict

mlh*_*789 7 python csv dictionary list

我有一个csv文件,其头部位于数据列的顶部,如...

a,b,c
1,2,3
4,5,6
7,8,9
Run Code Online (Sandbox Code Playgroud)

(即标准表格数据)

在阅读本文时,DictReader我使用嵌套循环将行中的项目附加到相应键中的列表中

desired_result = {'a': [1, 4, 7], 'b': [2, 5, 8], 'c': [3, 6, 9]}
Run Code Online (Sandbox Code Playgroud)

第一个循环将dict中的所有值设置为空列表.下一个循环遍历从csv文件读入的每一行,DictReader从中创建键值的dict.内部循环将值附加到与相应键值匹配的列表中,因此我最终得到所需的词典列表.我最终不得不经常写这个.

我的问题是,有更多的Pythonic方法使用没有嵌套循环的内置函数,或更好的习惯用法,或存储此数据结构的替代方法,以便我可以通过查询键值返回可索引列表?如果是这样,还有一种方法可以格式化由前面的列提取的数据吗?(对于MWE,只需将上面的数据复制到文本文件中并通过代码运行)提前感谢!

for*_*ord 7

根据您存储的数据类型以及使用numpy的情况,可以使用以下方法numpy.genfromtxt:

import numpy as np
data = np.genfromtxt('data.csv', delimiter=',', names=True)
Run Code Online (Sandbox Code Playgroud)

这样做会创建一个numpy 结构化数组,它提供了一个很好的接口,用于按标题名称查询数据(names=True如果你有一个标题行,请确保使用).

示例,给出data.csv包含:

a,b,c
1,2,3
4,5,6
7,8,9
Run Code Online (Sandbox Code Playgroud)

然后,您可以访问以下元素:

>>> data['a']        # Column with header 'a'
array([ 1.,  4.,  7.])
>>> data[0]          # First row
(1.0, 2.0, 3.0)
>>> data['c'][2]     # Specific element
9.0
>>> data[['a', 'c']] # Two columns
array([(1.0, 3.0), (4.0, 6.0), (7.0, 9.0)],
      dtype=[('a', '<f8'), ('c', '<f8')])
Run Code Online (Sandbox Code Playgroud)

genfromtext 还提供了一种方法,可以根据您的要求"格式化预先填充的数据."

转换器:变量,可选

将列数据转换为值的函数集.转换器还可用于为丢失的数据提供默认值:converters = {3:lambda s:float(s或0)}.