繁体   English   中英

通过将dict值追加到列表来进行JSON格式化

[英]JSON formatting by appending dict values to list

我有一个像这样的JSON对象:

{ "produktNr:"1234",
  "artNr_01":"12",
  "artNr_02":"23",
  "artNr_03":"",
  "artNr_04":"14",
  "name_01":"abc",
  "name_02":"der",
  "test":"junk"
}

我想将其转换成这样的字典:

{ "produktNr:"1234", "artNr":["12","23","","14"], "name":["abc","der"], "test":"junk"}

此转换基于给定的序列seq = ["artNr","name"] 因此,在字典的键中搜索序列的内容,并将值收集到列表中。

到目前为止我的尝试:

tempDict = {}
for key,value in fmData.iteritems():
    for seqval in seq:
        if seqval in key:
            if seqval in tempDict:
                tempDict[seqval].append(value)
            else:
                x = []
                x.append(value)
                tempDict[seqval]=x
        else:
            tempDict[key] = value

面临一些问题。

  • 值列表未排序,即"artNr":["","14","12","23"]而不是[_01,_02,_03,_04]

  • 无法从字典中弹出项目,因为在循环中无法删除字典项目,从而导致:

    {“ produktNr:” 1234“,” artNr“:[” 12“,” 23“,”“,” 14“],” artNr_01“:” 12“,” artNr_02“:” 23“,” artNr_03“:” “,” artNr_04“:” 14“,”名称“:[” abc“,” der“],”名称_01“:” abc“,”名称_02“:” der“,”测试“:”垃圾“}

很想了解如何处理此问题,尤其是如果有解决此问题的Python方法。

您可以使用collections包中的OrderedDict

from collections import OrderedDict
import re

input_dict = { "produktNr":"1234",
               "artNr_01":"12",
               "artNr_02":"23",
               "artNr_03":"",
               "artNr_04":"14",
               "name_01":"abc",
               "name_02":"der",
               "test":"junk" }

# split keys on the first '_'
m = re.compile('^([^_]*)_(.*)')

def _order_by( item ):
    # helper function for ordering the dict.
    # item is split on first '_' and, if it was successful 
    # the second part is returned otherwise item is returned
    # if key is something like artNr_42, return 42
    # if key is something like test, return test 
    k,s = item
    try:
        return m.search(k).group(2)
    except:
        return k

# create ordered dict using helper function
orderedDict = OrderedDict( sorted(input_dict.items(), key=_order_by))

aggregated_dict = {}
for k, v in orderedDict.iteritems():
    # split key
    match = m.search(k)

    if match:
        # key is splittable, i.e., key is something like artNr_42
        kk = match.group(1)
        if kk not in aggregated_dict:
            # create list and add value
            aggregated_dict[kk] = [v]
        else:
            # add value
            aggregated_dict[kk].append(v)
    else:
        # key is not splittable, i.e., key is something like produktNr
        aggregated_dict[k] = v

print(aggregated_dict)

提供所需的输出

{'produktNr': '1234', 'test': 'junk', 'name': ['abc', 'der'], 'artNr': ['12', '23', '', '14']}

您可以重新创建一个新字典,该字典将在列表的键中将键的值与'_'分组,而其他键和值保持不变。 应该这样做:

d = { "produktNr":"1234", "artNr_01":"12", "artNr_02":"23","artNr_03":"","artNr_04":"14","name_01":"abc","name_02":"der","test":"junk"}
new_d= {}
for k, v in d.items():
    k_new = k.split('_')[0]
    if '_' in k:
        if k_new not in new_d:
            new_d[k_new] = [v]
        else:
            new_d[k_new].append(v)
    else:
        new_d[k_new] = v
print(new_d)
# {'artNr': ['', '14', '23', '12'], 'test': 'junk', 'produktNr': '1234', 'name': ['der', 'abc']}

Dict是unordered集合,因此将值附加到列表的顺序是不确定的。

您的代码稍作修改:

tempDict = {}
for key,value in fmData.iteritems():
    seqval_in_key = "no"
    for seqval in seq:
        if seqval in key:
            seqval_in_key = "yes"
    for seqval in seq:
        if seqval in key:
            if seqval in tempDict:
                tempDict[seqval].append(value)
            else:
                x = []
                x.append(value)
                tempDict[seqval]=x
        else:
            if (seqval_in_key == "no"):
                tempDict[key] = value
print tempDict

结果:

{'produktNr': '1234', 'test': 'junk', 'name': ['abc', 'der'], 'artNr': ['14', '23', '', '12']}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM