python - 嵌套字典问题
问题描述
我需要创建一个接受 CSV 文件并返回嵌套字典的程序。外部字典的键应该是每行中的第一个值,从第二个开始(以便省略具有列名的行)。外部字典中每个键的值应该是另一个字典,我在下面解释。
内部字典的键应该是列名,而值应该是每一行中与该列对应的值。
例子:
对于这样的 CSV 文件:
column1, column2, column3, column4
4,12,5,11
29,47,23,41
66,1,98,78
我想以这种形式打印出数据:
my_dict = {
'4': {'column1':'4','column2':'12', 'column3':'5', 'column4':'11'},
'29': {'column1':'29', 'column2':'47', 'column3':'23', 'column4':'41'},
'66': {'column1':'66', 'column2':'1', 'column3':'98', 'column4':'78'}
}
到目前为止我最接近的(甚至还没有接近):
import csv
import collections
def csv_to_dict(file, delimiter, quotechar):
list_inside_dict = collections.defaultdict(list)
with open(file, newline = '') as csvfile:
reader = csv.DictReader(csvfile, delimiter=delimiter, quotechar=quotechar)
for row in reader:
for (k,v) in row.items():
list_inside_dict[k].append(v)
return dict(list_inside_dict)
如果我尝试使用上面的示例 CSV 文件delimiter = ","
、 和运行该函数quotechar = "'"
,它会返回以下内容:
{'column1': ['4', '29', '66'], ' column2': ['12', '47', '1'], ' column3': ['5', '23', '98'], ' column4': ['11', '41', '78']}
在这一点上,我迷路了。我试图改变:
list_inside_dict = collections.defaultdict(list)
为了
list_inside_dict = collections.defaultdict(dict)
然后简单地更改每个键的值,因为我无法附加到字典中,但这一切都变得非常混乱。所以我从头开始,发现我到达了同一个地方。
解决方案
您可以pandas
用于该任务。
>>> df = pd.read_csv('/path/to/file.csv')
>>> df.index = df.iloc[:, 0]
>>> df.to_dict('index')
不知道为什么要复制第一列的值,但如果您不这样做,上述简化为:
>>> pd.read_csv('/path/to/file.csv', index_col=0).to_dict('index')
推荐阅读
- python - Modin Pandas 和 Dask 除了挂起什么也不做
- karate - 无法使用没有标识符名称的数组断言单个数组中的所有元素
- jq - jq - 从文件中合并任意数量的 json 数组时列表中的重复对象
- javascript - 使用扩展运算符的 AssertionError
- terraform - 您可以使属性不触发资源更改吗?
- c# - 在 LEFT OUTER 连接上使用 Linq 删除“重复”结果
- django - Django - 在其依赖之前应用迁移
- swift - 更改 TableView 单元格中 UILabel 的前导和尾随约束(聊天气泡)
- java - 无法将类 java.lang.Integer 转换为类 java.lang.String
- php - QuickBook Online API 不包括运输服务行项目的折扣