Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字典中字典的多个键值对_Python_Python 2.7_Dictionary_String Formatting - Fatal编程技术网

Python 字典中字典的多个键值对

Python 字典中字典的多个键值对,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

我有一个csv文件,其中有一系列行的顺序如下:单个#,结果类型,计数:

1,结果04171
结果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
字段。