【问题标题】:python merge list of dictionaries based on keypython根据键合并字典列表
【发布时间】:2016-02-22 21:39:21
【问题描述】:

我正在寻找一个 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 个测量值。 并非一天中的每一秒都有测量值。 “加入”将在“时间”进行

【问题讨论】:

  • 我理解输入,但不是预期的输出。您期望从您给出的输入示例中得到什么输出?
  • @TreyHunner 我需要一张包含一天中所有秒数的表格,以及它们适用的测量值。稍后在此过程中,我需要填补那里的空白。
  • 听起来您可能需要一个字典,其中包含每个键的值列表:stackoverflow.com/a/7919673/98187

标签: python dictionary join merge key


【解决方案1】:

文档说:

dict.update = update(...)

D.update([E, ]**F) -> 无。从 dict/iterable E 和 F 更新 D。

如果 E 存在并且有一个 .keys() 方法,那么: for k in E: D[k] = E[k]

如果 E 存在并且缺少 .keys() 方法,则执行:for k, v in E: D[k] = v

在任何一种情况下,后面都是:for k in F: D[k] = F[k]

因为dictData 是一个列表并且没有keys() 方法,所以for k, v in dictData: t[k] = vupdate 方法中运行并导致异常。

其实我不是很理解你的代码,所以我不能给这个具体的帮助。

如果您能解释一下代码,我想为您提供帮助(例如,执行后正确的t 变量)。

【讨论】:

  • 至少现在我部分理解了我的错误。我知道我无法使用字典列表更新字典。我想要的是用 dictData 列表中的适当字典更新时间字典。这说明清楚了吗?
【解决方案2】:
#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)

在意识到出了什么问题并看到没有加入之后,这是最好的下一件事情。

【讨论】:

    猜你喜欢
    • 2022-11-28
    • 1970-01-01
    • 2023-01-26
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    相关资源
    最近更新 更多