如何在python字典中初始化tile?

时间:2015-05-11 22:59:50

标签: python json dictionary

我尝试从python词典数据类型生成JSON文件。

以下是在将其转储为Json格式之前涉及此问题的python代码段:

channelSeg = {}
channelSeg["ch"] = None
channelSeg["chdata"] = []
for e in channelPkg:
    print e
    attr = e.split(':')
    if attr[0] == "ch":
        channel = attr[1].split(',')
        channelSeg["ch"] = int(channel[0])

标题

我这样做初始化字典索引然后我可以在我的for循环中添加更多数据,如下所示:

channelSeg["ch"] = None
channelSeg["chdata"] = []

但我真的想做的是没有为他们分配任何数据

channelSeg["ch"] 
channelSeg["chdata"]

但是python不喜欢我这样做。

所以在转储操作之后,我得到了像这样的重复Json数据(部分)

"datapkg": [
    {
        "dataseg": [
            {
                "ch": 0, 
                "chdata": [
                    {
                        "euler": {
                            "y": "-19.32", 
                            "x": "93.84", 
    "z": "-134.14"                        
                        }
                    }, 
                    {
                        "areal": {
                            "y": "57", 
                            "x": "-242", 
                            "z": "-210"
                        }
                    }
                ]
            }, 
            {
                "ch": 1, 
                "chdata": [
                    {
                        "areal": {
                            "y": "-63", 
                            "x": "-30", 
                            "z": "10"
                        }
                    }
                ]
            }, 
            {
                "ch": null, 
                "chdata": []
            }
        ], 
        "t": "174464", 
        "n": "9884"
    }, 

我总是多余的:

    {
        "ch": null, 
        "chdata": []
    }

这使得这个JSON数据包不够健康,无论如何都要删除这段冗余数据?

非常感谢任何建议

=========== V2 ==============

在我考虑到爱德华的答案之后,我发现我只能用channelSeg解决它[“ch”] =无但我不知道如何处理另一个冗余列表,这是因为我没有发布足够的代码,所以我在这里通过了更完整的代码,并且仍在寻找解决方案.. 修改后的代码:

       for elem in sensorPkg:
        channelPkg = elem.split('&') # channelPkg contain each channel's reading
        # each channel need a dictonary to store data
        channelSeg = {}
        # channelSeg["ch"] = None
        channelSeg["chdata"] = []

        for e in channelPkg:
            attr = e.split(':')
            if attr[0] == "ch":
                new_channel = {
                    'ch': int((attr[1].split(','))[0])
                    #channelSeg["ch"] = int(channel[0])
                }
                channelSeg["chdata"].append(new_channel)
                # store channel numbers
            elif attr[0] == "euler":
                # create euler package
                numbers = attr[1].split(',')
                eulerSeg = {}
                d = {}
                d["x"] = numbers[0]
                d["y"] = numbers[1]
                d["z"] = numbers[2]
                eulerSeg["euler"] = d
                # append to channel segement
                channelSeg["chdata"].append(eulerSeg)
            elif attr[0] == "areal": # real accelrometer readings
                # create areal package
                numbers = attr[1].split(',')
                arealSeg = {}
                d = {}
                d["x"] = numbers[0]
                d["y"] = numbers[1]
                d["z"] = numbers[2]
                arealSeg["areal"] = d 
                # append to channel segement
                channelSeg["chdata"].append(arealSeg)
            #and so on

这是结果

 {
        "dataseg": [
            {
                "chdata": [
                    {
                        "ch": 0
                    }, 
                    {
                        "euler": {
                            "y": "6.51", 
                            "x": "73.16", 
                            "z": "-133.69"
                        }
                    }, 
                    {
                        "areal": {
                            "y": "516", 
                            "x": "-330", 
                            "z": "-7"
                        }
                    }
                ]
            }, 
            {
                "chdata": [
                    {
                        "ch": 1
                    }, 
                    {
                        "euler": {
                            "y": "24.86", 
                            "x": "4.30", 
                            "z": "-71.39"
                        }
                    }, 
                    {
                        "areal": {
                            "y": "120", 
                            "x": "316", 
                            "z": "273"
                        }
                    }
                ]
            }, 
            {
                "chdata": [
                    {
                        "ch": 2
                    }, 
                    {
                        "euler": {
                            "y": "62.32", 
                            "x": "-60.34", 
                            "z": "-120.82"
                        }
                    }, 
                    {
                        "areal": {
                            "y": "440", 
                            "x": "-611", 
                            "z": "816"
                        }
                    }
                ]
            }, 
            {
                "chdata": []
            }
        ], 
        "t": "14275", 
        "n": "794"
    }, 

哪个

                {
                "chdata": []
            }

还在那里

2 个答案:

答案 0 :(得分:2)

在您正在使用的数据结构中,我注意到' dataseg'是一个频道列表。现在,在将每个频道添加到数据集之前,您不需要初始化每个频道。首先将数据集初始化为空列表,然后在迭代channelPkg中的条目时,可以使用从channelPkg读取的信息创建新的通道序列,并立即附加它们:

dataseg = []
for e in channelPkg:
    attr = e.split(':')
    if attr[0] == "ch":
        new_channel = {
            'ch': int(attr[1].split(',')),
            'data': []
        }
        dataseg.append(new_channel)

希望有所帮助 - 我不确定您问题的背景是什么,所以请注意,如果这不能解决您的问题。

修改

我认为你的问题是最后一个channelPkg是空的。因此,for e in channelPkg:等同于for e in [],因此,外部循环的最后一次迭代仅附加初始化值(for e in channelPkg内的任何内容都不会执行)。

尝试添加两行来测试sensorPkg是否具有ch属性(我假设所有有效sensorPkg都具有ch属性):

for elem in sensorPkg:

    channelPkg = elem.split('&') 

    # Add this to prevent appending an empty channel
    if 'ch' not in [e.split(':')[0] for e in channelPkg]:
        break

    channelSeg = {}
    channelSeg["chdata"] = []

    for e in channelPkg:
        # ... etc

答案 1 :(得分:0)

尝试使用条件字典理解:

channelSeg["chdata"] = {ch.split(',')[0] if ch for ch in e.split(':')}