使用标题在字典中创建值?

时间:2017-10-27 07:16:15

标签: python-3.x dictionary

如何使用相同的键,但字典中的值不同?

我有一张Jeopardy问题表:

Show Number  Air Date    Round      Category         Value   Question    Answer
4680        12/31/2004  Jeopardy!   HISTORY          $200   Question 1  Copernicus
4680        12/31/2004  Jeopardy!   ESPN             $200   Question 2  Jim Thorpe
4680        12/31/2004  Jeopardy!   EVERYBODY TALKS  $200   Question 3  Arizona
4680        12/31/2004  Jeopardy!   THE COMPANY LINE $200   Question 4  McDonald's
4680        12/31/2004  Jeopardy!   EPITAPHS         $200   Question 5  John Adams

(注意:这存储在csv文件中。我只是试图在上面显示它的布局。它可用here, fyi

基本上,我正在尝试获得一个列表/字典/返回,其中包含一个与问题匹配的标题,类似于一个变量:

  

['Show Number':4680,'Air Date':'12 / 31/2004',...''回答':'哥白尼']
  ['显示号码':4680,'航空日期':'12 / 31/2004',......'答案':'吉姆索普']

  ['显示号码':4680,'航空日期':'12 / 31/2004',......'答案':'亚利桑那州']

所以稍后,我可以解析该字典(?)并做一些事情,比如根据类别,值等获取唯一值。它会是......列表的一个字典吗?

我试过把它变成字典 - 它不起作用。它只返回最后一行的数据。我理解为什么,因为每次行更改时,它都会重新开始并使用新信息更新相同的键。

import csv

file_name = 'JEOPARDY_CSV.csv'

def get_data(csv_file):
    data = []
    with open(csv_file, 'r',  encoding="utf8") as read:
        reader = csv.reader(read)
        all_data = list(reader)
        data = all_data[1:]
        headers = all_data[0]
    return data, headers

def create_dict(data, headers):
    i = 0
    data_dict = {}
    for row in data:
        for col in row:
            data_dict[headers[i]] = col
            i+=1
        i = 0
    print(data_dict)

def main():
    file_data, headers = get_data(file_name)
    data_dictionary = create_dict(file_data[0:5], headers)

if __name__ == "__main__":
    main()

同样,我的想法是,稍后会有一个我可以根据列标题运行的功能,例如“返回显示编号为4680的所有问题”,或“对于所有类别,返回唯一的类别”。

2 个答案:

答案 0 :(得分:1)

如果某些列组合唯一标识此数据集中的行(关系数据库理论中的主键),则应在字典的键中包含所有这些列。搜索密钥会很快。

或者,您可以将非唯一数据存储在行列表中(词典列表)。搜索值将需要循环遍历列表中的所有行。

答案 1 :(得分:1)

您当前的方法不会按预期拆分列。
另一个时刻csv.reader期望逗号,作为默认分隔符。文件中的列用任意数量的空格分隔。很明显应该有另一种方法来实现目标。

对于这种情况,我建议pandas解决方案:

import pandas as pd

file_name = 'JEOPARDY_CSV.csv'

def get_data(csv_file):
   df = pd.read_csv(file_name, sep='\s{2,}', engine='python', header=0)
   data = list(df.T.to_dict().values())
   return data

print(get_data(file_name))

输出是所需的字典列表

[{'Question': 'Question 1', 'Value': '$200', 'Air Date': '12/31/2004', 'Answer': 'Copernicus', 'Category': 'HISTORY', 'Show Number': 4680, 'Round': 'Jeopardy!'}, {'Question': 'Question 2', 'Value': '$200', 'Air Date': '12/31/2004', 'Answer': 'Jim Thorpe', 'Category': 'ESPN', 'Show Number': 4680, 'Round': 'Jeopardy!'}, {'Question': 'Question 3', 'Value': '$200', 'Air Date': '12/31/2004', 'Answer': 'Arizona', 'Category': 'EVERYBODY TALKS', 'Show Number': 4680, 'Round': 'Jeopardy!'}, {'Question': "McDonald's", 'Value': 'Question 4', 'Air Date': '12/31/2004', 'Answer': None, 'Category': 'THE COMPANY LINE $200', 'Show Number': 4680, 'Round': 'Jeopardy!'}, {'Question': 'Question 5', 'Value': '$200', 'Air Date': '12/31/2004', 'Answer': 'John Adams', 'Category': 'EPITAPHS', 'Show Number': 4680, 'Round': 'Jeopardy!'}]

更进一步,pandas允许您对列值进行分组,获取唯一记录,执行聚合以及许多其他...