簡體   English   中英

字典中字典的多個鍵值對

[英]Multiple key value pairs for a dictionary within dictionary

我有一個 csv 文件,里面有一堆這樣排序的行:Individual#,ResultType,Count:

1,RESULT004,171
1,RESULT005,71
2、結果001、12
2、結果004981
...

我的目標是最終制作一個人類可讀的表格,其中包含行上的個人以及他們將每個結果作為列的次數。 如果他們沒有結果,我想要一個零。 像這樣:

個人1,0,0,0,171,71
個人2,12,0,0,981,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')

當我嘗試指定未找到 RESULT 的匹配項時會發生什么時,我最終將太多內容寫入文件(例如,每當個人和 RESULT 不匹配時,這經常發生)。 考慮更多,似乎字典將是替代方法。 在(某種)偽代碼中:

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')

我無法將我的文件作為由每個人的字典組成的字典閱讀並正確訪問它。

任何幫助,將不勝感激。

使用__missing__鈎子在一個簡單的dict子類中累積值,這樣格式化的用戶 ID 始終是結果子dict一部分。 然后使用DictWriter將它們寫回,它可以自動查找必要的字段,並自動填充缺失值:

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)

您可以使用字典獲得二維數組的功能

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)

您還可以更改兩個join ",""\\t"分隔符。

它還利用了count[i,r]等價於count[(i,r)]的事實(dict 元素的鍵是一個 2 元組)。

您可以添加一些錯誤檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM