首页 > 解决方案 > 嵌套字典问题

问题描述

我需要创建一个接受 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)

然后简单地更改每个键的值,因为我无法附加到字典中,但这一切都变得非常混乱。所以我从头开始,发现我到达了同一个地方。

标签: pythonpython-3.xdictionarynested

解决方案


您可以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')

推荐阅读