如何使用相同的键,但字典中的值不同?
我有一张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的所有问题”,或“对于所有类别,返回唯一的类别”。
答案 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
允许您对列值进行分组,获取唯一记录,执行聚合以及许多其他...