使数组具有相同的长度,并附加json字符串

时间:2019-06-21 09:28:20

标签: python arrays json

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

column = defaultdict(list)

[...]

for line in out.splitlines():
    column[i + 1].append({"row": str(line)})

[...]

f = open(save_dir + 'table_data.json', "w+")
f.write(json.dumps(column))
f.close()

这最终将生成一个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字符串中发现了两个错误:

  1. 似乎在第一个数组周围添加了另一个数组。 JSON字符串现在以[ [ {

  2. 开头
  3. 它将删除“父”数组"1", "2" and "3"

1 个答案:

答案 0 :(得分:1)

罪魁祸首在行:

final = ([v + ["{'row'}: ''"] * (longest_array - len(v)) for v in column.values()])

其中:

  • 这是一个 列表 理解(而不是 dict理解):通过迭代column.values() ,您将丢失所有键,并且所有与值对应的列表都被“打包”在外部(主)列表中
  • 不确定{{1}中的 双引号 )尝试达到什么目的}:这是带有一个 string 元素
  • 的列表

要解决您的问题,请将上面的行变为:

["{'row'}: ''"]

最终将成为预期的字典:

final = {k: v + [{'row': ''}] * (longest_array - len(v)) for k, v in column.items()}