簡體   English   中英

python基於鍵的字典合並列表

[英]python merge list of dictionaries based on key

我正在尋找聯接的python替代方案。

我正在嘗試獲取每一天的清單,並根據時間戳將數據加入其中。 到目前為止,我是這樣的:

keys=('DRIP_ID','DESCR','OBJECT','TIMESTAMP','DRIP_R1','DRIP_R2','RT_DISP1','RT_DISP2','DAY','TIME')

鍵是列名

rawdata=[['242418',"242418 Rechts.BD242418: tot Oudkarspel -  - ${pijlop} N242  10 min - N508  14 min${pijlr}",'BD242418','20150701063825','N242','N508','10','14','20150701','063825'],
['242418',"242418 Rechts.BD242418: tot Oudkarspel -  - ${pijlop} N242  10 min - N508  14 min${pijlr}",'BD242418','20150701064327','N242','N508','10','14','20150701','064327'],
['242418',"242418 Rechts.BD242418: tot Oudkarspel -  - ${pijlop} N242  10 min - N508  14 min${pijlr}",'BD242418','20150701085717','N242','N508','10','14','20150701','085717'],
['242418',"242418 Rechts.BD242418: tot Oudkarspel -  - ${pijlop} N242  10 min - N508  14 min${pijlr}",'BD242418','20150701100116','N242','N508','10','14','20150701','100116'],
['242418',"242418 Rechts.BD242418: tot Oudkarspel -  - ${pijlop} N242  10 min - N508  14 min${pijlr}",'BD242418','20150701191611','N242','N508','10','14','20150701','191611'],
['242418',"242418 Rechts.BD242418: tot Oudkarspel -  - ${pijlop} N242  10 min - N508  14 min${pijlr}",'BD242418','20150701213616','N242','N508','10','14','20150701','213616']]

原始數據是軟件產生的

sec = ['00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59']
mm = sec
hh = ['00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23']
timestamp=()
time = []
dictData = []

# Dictionary with all seconds (HHMMSS) in 1 day
for ih, uur in enumerate(hh):
    if ih < 24:
          for im, minutes in enumerate(mm):
              if im < 60:
                  for isec, secs in enumerate(sec):
                      if isec < 60:
                        timestamp = str(uur)+str(minutes)+str(secs)
                        timeDict = dict()
                        timeDict['DRIP_ID']=""
                        timeDict['DESCR']=""
                        timeDict['OBJECT']=""
                        timeDict['TIMESTAMP']=""
                        timeDict['DRIP_R1']=""
                        timeDict['DRIP_R2']=""
                        timeDict['RT_DISP1']=""
                        timeDict['RT_DISP2']=""
                        timeDict['DAY']=""
                        timeDict['TIME']=timestamp
                        time.append(timeDict)

在這里,我一天中的所有時間都是秒,並為它們提供了相同的鍵,以便於進行匹配

# Turn raw data into dictionary                        
for row in rawdata:
    dictionary = dict(zip(keys, row))
    dictData.append(dictionary)

然后我將原始數據也轉換成字典

#Join, sort off
compleet=()
for t in time:
    t.update(dictData)
    compleet.append(t)

print len(compleet)
print compleet[1]

但是,當我運行此命令時,出現錯誤:

ValueError: dictionary update sequence element #0 has length 10; 2 is required

這使我相信我一次只能更新key:value對,但是我不確定這是正確的。

此外:這是1:1的聯接。 1個時間戳只能進行1個測量。 並非一天中的每一秒鍾都有測量結果。 “加入”時間為“ TIME”

該文件說:

dict.update =更新(...)

D.update([E,] ** F)->無。 從dict /可迭代E和F更新D。

如果E存在並且具有.keys()方法,則執行以下操作:對於E中的k:D [k] = E [k]

如果E存在並且缺少.keys()方法,則執行:對於k,E中的v:D [k] = v

無論哪種情況,都緊隨其后:對於F中的k:D [k] = F [k]

因為dictData是一個列表並且沒有keys()方法,所以for k, v in dictData: t[k] = vupdate方法中運行,並導致異常。

實際上,我不太了解您的代碼,因此無法對此提供具體幫助。

如果您能解釋代碼(例如,執行后正確的t變量),我想為您提供幫助。

#Same result as a join, by iterating.
for iTime, t in enumerate(time):
    for iData, d in enumerate(dictData):
        if t['TIME'] == d['TIME']:
            t.update(d)

在意識到出了什么問題之后,並沒有看到加入,這就是最好的下一件事。

暫無
暫無

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

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