使用 pandas 从两个列表创建 JSON 数组

Creating a JSON array from two lists using pandas

提问人:CLT00 提问时间:11/17/2023 最后编辑:CowCLT00 更新时间:11/17/2023 访问量:39

问:

是否可以将两个列表压缩到一个JSON数组中?

输入:

    keys=["['os','dist','rel','flag']",
          "['os','dist']",
          "['os','dist','rel']",
          "['os','version','rel','flag']"]
    vals=["['linux','centos','9','y']",
         "['linux','ubuntu']",
         "['linux','rhel','8']",
         "['linux','8','.03','y']"]
    df=pd.DataFrame({'key':keys,'val':vals})

期望输出:

{'key':'os','val':'linux'},{'key':'dist','val':'rhel'},{'key':'rel','val':'9'},{'key':'flag','val':'y'}
...
...

我是 python 的新手,尝试了 list/map/lambda/zip 的几种不同组合,但到目前为止没有成功。

python 数组 json pandas 列表

评论

1赞 JNevill 11/17/2023
您在列表内有列表的字符串表示形式吗?你想把这个字符串表示形式变成一个适当的列表,然后,忽略两个维度之一,把一个字典列表串在一起?是否确定?输入和输出都是奇数。你有没有试图解决一些更大的问题,导致你走上这条路?
0赞 Tim Roberts 11/17/2023
你确定这就是你所拥有的数据结构吗?因为这很奇怪。您有两个字符串列表。它不是列表的列表,因为它们是用引号括起来的,也不是 JSON,因为它们使用单引号。

答:

1赞 Tim Roberts 11/17/2023 #1

这是可以做到的,但你当然不需要或想要熊猫。我的猜测是这不是您想要的实际结果,但这是如何做到的。

import ast

keys=["['os','dist','rel','flag']",
      "['os','dist']",
      "['os','dist','rel']",
      "['os','version','rel','flag']"]
vals=["['linux','centos','9','y']",
     "['linux','ubuntu']",
     "['linux','rhel','8']",
     "['linux','8','.03','y']"]

keys = [ast.literal_eval(k) for k in keys]
vals = [ast.literal_eval(v) for v in vals]

results = [] 
for kk,vv in zip(keys, vals):
    results.extend( [{'key': k, 'val': v} for k,v in zip(kk,vv)] )

from pprint import pprint
pprint(results)

输出:

[{'key': 'os', 'val': 'linux'},
 {'key': 'dist', 'val': 'centos'},
 {'key': 'rel', 'val': '9'},
 {'key': 'flag', 'val': 'y'},
 {'key': 'os', 'val': 'linux'},
 {'key': 'dist', 'val': 'ubuntu'},
 {'key': 'os', 'val': 'linux'},
 {'key': 'dist', 'val': 'rhel'},
 {'key': 'rel', 'val': '8'},
 {'key': 'os', 'val': 'linux'},
 {'key': 'version', 'val': '8'},
 {'key': 'rel', 'val': '.03'},
 {'key': 'flag', 'val': 'y'}]

评论

0赞 JNevill 11/17/2023
这是一个如此奇怪的输出。我不禁认为,一个更明智的输出是,不会破坏内部列表的关系,即使 OP 准确地要求您生成的🤷输出results = [[{k:v} for k,v in zip(kk,vv)] for kk,vv in zip(keys, vals)]
1赞 Tim Roberts 11/17/2023
你是绝对正确的,事实上,当我写这个回应时,这正是我让代码生成的,因为我认为这是对的。当我意识到它与他说的不符时,我正要发布输出。
0赞 JNevill 11/17/2023
我不得不写那段代码只是为了挠痒痒,让一切都与世界正确。