Python 使数组长度相同,追加json字符串

Python 使数组长度相同,追加json字符串,python,arrays,json,Python,Arrays,Json,我有一个添加到列表中的Python脚本: column=defaultdict(列表) [...] 对于line in out.splitlines(): 列[i+1]。追加({“行”:str(行)}) [...] f=打开(保存目录+‘table_data.json’,‘w+’) f、 写入(json.dumps(列)) f、 关闭() 这将最终生成一个JSON文件,其字符串如下: { "1":[ { "row":"Product/Descriptian"

我有一个添加到列表中的Python脚本:

column=defaultdict(列表)
[...]
对于line in out.splitlines():
列[i+1]。追加({“行”:str(行)})
[...]
f=打开(保存目录+‘table_data.json’,‘w+’)
f、 写入(json.dumps(列))
f、 关闭()
这将最终生成一个JSON文件,其字符串如下:

{ "1":[
      {
         "row":"Product/Descriptian"
      }
   ],
   "2":[
      {
         "row":"Qty/unit"
      },
      {
         "row":"Text"
      }
   ],
   "3":[
      {
         "row":""
      }
   ]}
如您所见,
array[“2”]
有两个值。我试图使所有数组的长度相同。因此
array[“1”]
array[“3”]
最终也将有两个值

因此,为了做到这一点,我想我必须首先找到最长的数组:

longest_array = (max(map(len, column.values())))
这应该返回
2
。现在我想将一个空的
{“row”:“}
附加到其他数组中,使其长度相同:

final = ([v + ["{'row'}: ''"] * (longest_array - len(v)) for v in column.values()])
以下输出JSON字符串:

[
   [
      {
         "row":"Product/Descriptian"
      },
      {
         "row":""
      }
   ],
   [
      {
         "row":"Qty/unit"
      },
      {
         "row":"Text"
      }
   ],
   [
      {
         "row":""
      },
      {
         "row":""
      }
   ]
]
这似乎起了部分作用。但是,我在新创建的JSON字符串中发现了两个错误:

[
   [
      {
         "row":"Product/Descriptian"
      },
      {
         "row":""
      }
   ],
   [
      {
         "row":"Qty/unit"
      },
      {
         "row":"Text"
      }
   ],
   [
      {
         "row":""
      },
      {
         "row":""
      }
   ]
]
  • 它似乎在第一个数组周围添加了另一个数组。JSON字符串现在以
    [{

  • 它删除“父”数组
    “1”、“2”和“3”


  • 罪魁祸首是:

    final=([v+[“{'row'}:”]*(最长的数组-len(v))表示列中的v.values())
    
    其中:

    • 这是一个列表理解(而不是dict理解):通过迭代
      column.values()
      ,您将丢失所有键,并且与值对应的所有列表都已“打包”到外部(主)列表中
    • 不确定您试图通过
      [“{row'}:”]
      中的双引号()实现什么:这是一个包含一个字符串的列表
    要解决您的问题,请将上述行转换为:

    final = {k: v + [{'row': ''}] * (longest_array - len(v)) for k, v in column.items()}
    
    最终版本将成为预期的词典:

    >列
    defaultdict(,{'1':[{'row':'Product/Descriptian'}],'2':[{'row':'Qty/unit'},{'row':'Text'}],'3':[{'row':''}]
    >>>
    >>>最长数组长度=最大值((len(v)表示列中的v.values())
    >>>最长数组长度
    2.
    >>>final={k:v+[{'row':'''}]*(最长的数组长度-len(v))表示k,v在column.items()中
    >>>
    >>>决赛
    {'1':[{'row':'Product/Descriptian'},{'row':''''}],'2':[{'row':'Qty/unit'},{'row':'Text'}],'3':[{'row':''},{'row':'''}]
    

    在开始转储之前,您是否尝试过更改字典?这似乎比更正JSON字符串更容易。由于列表是动态创建的,所以我不太确定如何做到这一点。我不知道在转储之前,哪个数组将是最长的,您也可以直接调用:
    longest\u array=(max(map(len,column.values())))
    然后根据编辑词典在写入文件之前,我正在调用
    final=…