在将数据从Oracle数据库读入数组后,我需要将perl哈希值转换为嵌套的键控Python字典。最有效的方法是什么?现有的Perl代码(我根本不知道Perl)看起来像这样:
# read the data and place into a species hash (sphash) and a data hash (tmphash)
my (@lnarr, %sphash, %tmphash, $tmpln, $tmpsel, $x, $datetime) ;
while (@lnarr = $csr->fetchrow_array) {
$datetime = $lnarr[4].'-'.$lnarr[5] ;
$tmpln = join '_', $lnarr[8], $lnarr[9] ;
$sphash{$lnarr[7]} = 'x';
$tmphash{$lnarr[0].'_'.$lnarr[1].'_'.$lnarr[2].'_'.$lnarr[3].'_'.$datetime.'_'.$lnarr[6]}{$lnarr[7]} .= $tmpln ;
} #while line
我不确定创建嵌套字典的最有效途径是什么......任何指导都会很棒。
我的初始代码看起来像这样,但我知道这可能是非常错误的(我也只是学习python): 前几行是根据以下帖子将Oracle输出中的元组读入字典:here
#this is creating the dictionary from the data
cursor.execute(query, cruise6_input=cruise6_input)
desc=[d[0] for d in cursor.description]
result=[dict(zip(desc,line)) for line in cursor]
station=[r['STATION'] for r in result]
time=[r['GMT_TIME']for r in result]
svspp=[r['SVSPP'] for r in result]
expcatchwt=[r['EXPCATCHWT'] for r in result]
beglat=[r['BEGLAT'] for r in result]
expcatchnum=[r['EXPCATCHNUM'] for r in result]
cruise=[r['CRUISE'] for r in result]
towdate=[r['BEGIN_GMT_TOWDATE'] for r in result]
stratum=[r['STRATUM'] for r in result]
beglon=[r['BEGLON'] for r in result]
tmpln=zip(expcatchwt,expcatchnum)
tmphash=zip(station,time,beglat,cruise,towdate,stratum,beglon)
keys=zip(tmphash,svspp)
如何获得tmphash [svspp] = tmpln的输出?如果我打印tmphash [svspp],结果只是{} ....
答案 0 :(得分:2)
在python词典中,项目访问使用dictionary[key]
;因此,您需要更正sphash
和tmphash
sphash[result[7]] = 'x'
tmphash[result[0] + '_' + result[1] + '_' + result[2] + '_' + result[3] + '_' + datetime + '_' +
result[6]][result[7]] = tmpln
这假设tmphash[somekey]
本身已经是字典。您可以将其定义为defaultdict
:
from collections import defaultdict
tmphash = defaultdict(dict)
现在,每个tmphash
密钥在访问时自动成为另一个dict
。
答案 1 :(得分:0)
尽我所能纠正你的python代码:
# I have no idear what this is suppose to do
# i guess you are trying to mimic the array assignment in
# the while loop...but I think you are doing it wrong, please update your
# poste so we can make sense of it
desc=[d[0] for d in cursor.description]
# makes a list of dicts with the entire desc array as key and one line as value?!?!
result=[dict(zip(desc,line)) for line in cursor]
tmphash = {}
spset=set() # if you want an spset instead of hash
while (True): # this should probably be a for loop with your array
datetime="%s-%s" % results[4:6]
tmpln='_'.join(result[8:10])
# here you probberbly want to add to a set instead of making a hash mapping to something useless
sphash[result[7]]='x'
# or
spset.add(result[7])
# .= is a string concatination operator in perl
# += can also concatinate strings in python
tmphash['_'.join(result[0:4]+[datetime]+result[6:8]] += tmpln