2015-04-24 30 views
2

因此,現在我有一個字典dataDict,它具有值爲'node-key'的鍵,其中節點是特定的csv文件頭,鍵是可能存在或不存在於每個文件中的字段。我有一個normalDict['Time']需要從dataDict[node-'Time']所有時間,並把他們整理。我想爲dataDict中的每個'node-key'條目製作一個規範化字典。於是我通過normalDict['Time']值迭代,如果idataDict[nodeTime],我想在同一位置添加dataDict[nodeKey]價值爲dataDict[nodeTime]normalDict[nodeKey],而如果normalDict['Time']值不在dataDict[nodeTime],我想追加一個'nan'normalDict[nodeKey]Python:只需要字典中的特定值;正常化節點密鑰對

(我的腳本目前的圖dataDict [nodeKey] vs dataDict [nodeTime],我想規範化時間以包括所有節點的時間在一個軸上,並添加'nan的dataDict [nodeKey]到值沒有發生)

編輯:澄清: 所以可以說我有

所以說

dataDict['1-Time'] = ['12:00','1:00','2:00'] 
dataDict['2-Time'] = ['12:30','1:30','2:30','3:30'] 

我也有一個具有相同數目的項鍵的值,列在兩次這樣:

dataDict['1-lattitude']=['0','1','2'] 
dataDict['2-lattitude']= ['1','2','3','3'] 

而且

normalDict['Time'] = ['12:00','12:30','1:00','1:30','2:00','2:30','3:30'] 

話,我想有

normalDict['1-lattitude'] = [ '0', 'nan', '1', 'nan', 2', 'nan', 'nan']` 

normalDict['2-lattitude'] = ['nan', '1', 'nan', '2', 'nan', '3', '3'] 

因此,在normalDict每個按鍵都有價值爲等量在normalDict['Time']

這裏是我的方法,我已經評論了我的頭腦中有意義的特定行,以便如何訪問特定鍵的單個項目,但是我知道由於解包錯誤導致它不正確。任何幫助將不勝感激,因爲我可能會遇到與後面的腳本這個問題。

def normalizeDataByField(self, fileName,keyNames): 

     #this normalizes time how I want 
     setTimes = set() 
     listTimes = [] 
     tupleTime=[] 
     for i in range(len(fileName)): 
      node = self.deriveNodeName(fileName[i]) 
      nodeTime= '%s-Time' %(node) 
      for key in dataDict: 
       if 'Time' in key and node in key: 
        for i in dataDict[key]: 
         setTimes.add(i) 
      listTimes+=setTimes 
      listTimes.sort() 
      normalDict['Time'] = listTimes 


     for a in range(len(fileName)): 
      node = node = self.deriveNodeName(fileName[a]) 
      nodeTime='%s-Time' %(node) 
      for key in keyNames: 
       nodeKey= '%s-%s' %(node,key) 

       for i,j in normalDict['Time'],dataDict[nodeKey]: #this is my flaw in logic as I get ValueError: too many values to unpack 

        print "looking for %s in dataDict[nodeTime]" %(i) 
        if i in dataDict[nodeTime]: 
         print "%s found in dataDict[%s]" %(i,nodeTime) 
         normalDict[nodeKey].append(j) 
        else: 
         print "%s not found in dataDict[%s]. Appending 'nan'" %(i,nodeTime) 
         normalDict[nodeKey].append('nan') 
+0

這個問題是措辭還不是很清楚。你是否正在尋找像'normalDict [t] = {k:dataDict.get(「%s-%s」%(t,k),None)for k in keys]}? – badp

+0

我編輯了我的帖子並添加了我的目標的說明。我需要找到一種方法來添加與normalDict ['Time']相同數量的值來創建normalDict [nodeKey]條目,但我需要確保在正確的位置添加nan以匹配它們對應的nodeTime。 – Kevin

回答

0

所以我相信我能回答我自己的問題,但它有點混亂。我決定將每個dataDict[nodeKey]存儲在列表dataList中,並根據其列表索引j將值附加到normalDict[nodeKey]。我也在創建normalDict['Time']的for循環中發現錯誤。

def normalizeDataByField(self, fileName,keyNames): 
    setTimes = set() 
    listTimes = [] 
    tupleTime=[] 
    for i in range(len(fileName)): 
     node = self.deriveNodeName(fileName[i]) 
     nodeTime= '%s-Time' %(node) 

     for key in dataDict: 
      if nodeTime in key: 
       for i in dataDict[key]: 
        setTimes.add(i) 
    listTimes+=setTimes 
    listTimes.sort() 
    normalDict['Time'] = listTimes 


    for a in range(len(fileName)): 
     node = node = self.deriveNodeName(fileName[a]) 
     nodeTime='%s-Time' %(node) 
     for key in keyNames: 
      if 'Time' not in key: 
       nodeKey= '%s-%s' %(node,key) 
       dataList = dataDict[nodeKey] 
       j=0 
       for i in normalDict['Time']: 
        print "looking for %s in dataDict[nodeTime]" %(i) 
        if i in dataDict[nodeTime]: 
         print "%s found in dataDict[%s]. Appending value." %(i,nodeTime) 
         try: 
          normalDict[nodeKey].append(dataList[j]) 
          j+=1 
          print "j = ",j 
         except: 
          print "Index out of range. j = ", j 
        else: 
         print "%s not found in dataDict[%s]. Appending 'nan'" %(i,nodeTime) 
         normalDict[nodeKey].append('nan') 
    for key in normalDict: 
     print "len(normalDict[%s] = %d" %(key, len(normalDict[key])) 

這最後一個for循環顯示normalDict中的所有鍵具有相同的長度。 也許這不是最漂亮的解決辦法,但我還是能夠創建與我所需要的值,並把「南」值的字典在必要時與對應normalDict['Time']

0
time_key='1-Time' 
lattitude_key='1-lattitude' 

def normalize(normalDict, dataDict, lattitude_key, time_key): 
    normalDict[lattitude_key]=['nan' for _ in range(len(normalDict['Time']))] 
    for i, e in enumerate(dataDict[time_key]): 
     normalDict[lattitude_key][normalDict['Time'].index(e)]=dataDict[lattitude_key][i] 
相關問題