将多维数组转换为没有任何导入的字典

时间:2018-12-17 20:30:56

标签: python python-3.x

假设我有以下csv数据:

first_name,last_name
tom,hanks
tom,cruise

我想按如下方式转换此数据:

data = {
    'first_name': ['tom','tom'],
    'last_name': ['hanks', 'cruise']
}

执行上述操作的最佳方法是什么(不使用诸如pandas,numpy或csv之类的库)。

2 个答案:

答案 0 :(得分:6)

我个人会选择pandascsv,但这很容易实现,无需导入:

header = None
data = {}
for line in myfile:
    lstrip = line.strip().split(",")
    if not header:
        header = lstrip
        data = {k: [] for k in header}
    else:
        for i, value in enumerate(lstrip):
            data[header[i]].append(value)

print(data)
#{'first_name': ['tom', 'tom'], 'last_name': ['hanks', 'cruise']}

答案 1 :(得分:2)

添加文件

>>> from io import StringIO                                                                                            
>>> file = StringIO('''first_name,last_name 
...: tom,hanks 
...: tom,cruise''')

创建字典:

>>> data = [(k, []) for k in next(file).strip().split(',')]                                                            
>>> for line in file: 
...:     for i, field in enumerate(line.strip().split(',')): 
...:         data[i][1].append(field) 
...:                                                                                                                   
>>> data = dict(data)                                                                                                  
>>> data                                                                                                               
{'first_name': ['tom', 'tom'], 'last_name': ['hanks', 'cruise']}

这实际上是编程练习,而不是您在现实世界中应使用的解决方案。它根本不够健壮,并且会在各种常见情况下失败,例如在csv文件中用引号引起来的字段包含逗号。


使用csv,供其他读者使用:

>>> import csv                                                                                                         
>>> reader = csv.reader(file) # assume fresh StringIO instance
>>> dict(zip(next(reader), zip(*reader)))                                                                              
{'first_name': ('tom', 'tom'), 'last_name': ('hanks', 'cruise')}

(如果将列表作为值很重要,请使用dict(zip(next(reader), map(list, zip(*reader))))。)