Python 字典中字典的多个键值对
我有一个csv文件,其中有一系列行的顺序如下:单个#,结果类型,计数: 1,结果04171Python 字典中字典的多个键值对,python,python-2.7,dictionary,string-formatting,Python,Python 2.7,Dictionary,String Formatting,我有一个csv文件,其中有一系列行的顺序如下:单个#,结果类型,计数: 1,结果04171 结果005,71 结果001,12 2,结果04981 ... 我的目标是最终生成一个人类可读的表,其中包含行中的个人以及他们将每个结果作为列的次数。如果他们没有结果,我想要一个零。像这样: 个人1,0,0,0171,71 个人2,12,0,0981,0 我正在努力寻找最好的方法。我首先尝试以列表的形式读入文件,我可以创建一个表,但是当没有匹配的测试结果时,没有零,通过这样做: import csv
结果005,71
结果001,12
2,结果04981
... 我的目标是最终生成一个人类可读的表,其中包含行中的个人以及他们将每个结果作为列的次数。如果他们没有结果,我想要一个零。像这样: 个人1,0,0,0171,71
个人2,12,0,0981,0 我正在努力寻找最好的方法。我首先尝试以列表的形式读入文件,我可以创建一个表,但是当没有匹配的测试结果时,没有零,通过这样做:
import csv
individuals = [1,2,13,15,91]
resultlist = ['RESULT001', 'RESULT002', 'RESULT003', 'RESULT004', 'RESULT005']
intermediatelist = []
datafile = open(infile, 'rU')
datareader = csv.reader(datafile)
for row in datareader:
intermediatelist.append(row)
for individual in individualslist:
resultfile.write(str(individual) + ',')
for result in resultlist:
for row in intermediatelist:
if str(individual) == row[0] and result == row[1]:
resultfile.write(result + ',' + str(row[2]) + ',')
resultfile.write('\n')
当我试图指定找不到匹配结果时会发生什么情况时,我最终会向文件中写入太多的内容(例如,当个人和结果不匹配时,通常是这样)。再想一想,字典似乎是最好的选择。在(种类)伪代码中:
for individual in individual list:
outfile.write(individual)
for test in testlist:
if test in ditionary_for_individual1:
outfile.write(dictionary_for_individual1[test])
else:
outfile.write('0')
我很难把我的文件作为字典来阅读,因为字典是由每个人的字典组成的,并且无法正确地访问它
任何帮助都将不胜感激。使用在一个简单的
dict
子类中累积值,因此格式化的用户ID始终是生成的子dict
的一部分。然后使用可自动查找必要字段并自动填充缺失值的
import csv
# Make a dict subclass that autovivifies child dict with user field filled in
class AutoUserDict(dict):
__slots__ = ()
def __missing__(self, key):
'''Expects int user ID, formats as Individual###'''
self[key] = ret = {'user': 'Individual{}'.format(key)}
return ret
resultlist = ['RESULT001', 'RESULT002', 'RESULT003', 'RESULT004', 'RESULT005']
intermediateresults = AutoUserDict()
with open(infile, 'rb') as datafile:
datareader = csv.reader(datafile)
for user, rslttype, value in datareader:
# Store new rslttype (will create subdict with formatted user first if needed)
intermediateresults[int(user)][rslttype] = int(value)
with open(outfile, 'rb') as outf:
datawriter = csv.DictWriter(outf, fieldnames=['user']+resultlist, restval='0')
for user, data in sorted(intermediateresults.items()):
datawriter.writerow(data)
您可以使用词汇表获得2D数组的功能
individuals = []
results = []
counts = {}
# read data
with open(inp_file_name,'r') as inp_file:
for inp_line in inp_file:
inp_list = inp_line.strip().split(','):
i,r,c = inp_list
if i not in individuals: individuals.append(i)
if r not in results: results.append(r)
counts[i,r] = int(c)
# optional sort
individuals.sort()
results.sort()
# print data
with open(out_file_name,'w') as out_file:
# header
out_list = [''] + results
out_file.write( "%s\n" % (" ".join(out_list)))
# table
for i in individuals:
out_list = [ i ]
for r in results:
c = counts.get((i,r),0)
out_list.append( "%d" % c )
out_file.write( "%s\n" % (" ".join(out_list)))
这假设每个单独/结果组合发生一次。否则更改为counts[i,r]=int(c)+counts.get((i,r),0)
您还可以为两个连接更改“、”
或“\t”
的分隔符
它还利用了count[i,r]
相当于count[(i,r)]
(dict元素的键是一个2元组)
您可以添加一些错误检查。不是很pythonic,但我编写了一个脚本来编写代码,为每个人制作字典(例如,individual1={RESULT004:171,RESULT005:71}
等等)。但现在我又被卡住了。我有我的个人列表,但我不知道如何使用相同的名称调用字典来查找键:值对。也许我需要学习字符串格式?请避免在您自己的问题下发表评论,而您可以将其添加到您的问题本身。dict.\uuu缺少\uuu
hook做的事情与collections.defaultdict?@Apero:是的,但是\uuuu missing\uuuu
钩子允许您访问您试图访问的键
,允许我们仅构造一次用户
字段(在首次访问该键时),其中,defaultdict
只接受一个可调用的零参数,该参数不能计算键的默认值。如果使用defaultdict(dict)
,则必须将intermediateresults[int(user)][rslttype]=int(value)
更改为类似于intermediateresults[int(user)].update({'user':'Individual{}.format(user),rslttype:int(value)})的内容,以确保填充user
字段。