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)
这里我做了一天所有的秒,并且给了他们相同的key,方便匹配
# 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 个测量值。
并非一天中的每一秒都有测量值。
'Join on' 会在 "TIME"
文档说:
dict.update = update(...)
D.update([E, ]**F) -> None. Update D from dict/iterable E and F.
If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
If E is present and lacks a .keys() method, then does: for k, v in E: D[k]
= v
In either case, this is followed by: for k in F: D[k] = F[k]
因为dictData
是一个列表,没有keys()
方法,for k, v in dictData: t[k]
= v
在update
方法内部运行,导致异常。
其实我不太理解你的代码,所以我不能给出具体的帮助。
如果你能解释一下代码(例如执行后正确的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)
在意识到出了什么问题并且没有看到加入之后,这是最好的下一件事。
我正在寻找 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)
这里我做了一天所有的秒,并且给了他们相同的key,方便匹配
# 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 个测量值。 并非一天中的每一秒都有测量值。 'Join on' 会在 "TIME"
文档说:
dict.update = update(...)
D.update([E, ]**F) -> None. Update D from dict/iterable E and F.
If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v
In either case, this is followed by: for k in F: D[k] = F[k]
因为dictData
是一个列表,没有keys()
方法,for k, v in dictData: t[k]
= v
在update
方法内部运行,导致异常。
其实我不太理解你的代码,所以我不能给出具体的帮助。
如果你能解释一下代码(例如执行后正确的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)
在意识到出了什么问题并且没有看到加入之后,这是最好的下一件事。