如何在Python中从两个列表制作一个json

时间:2019-04-22 05:31:57

标签: python json

假设我有两个列表:

table_headers = ['name', 'surname']
table_data = ['andrew', 'smith', 'bob', 'richardson']

我如何制作这样的东西:

json = {
    'name': ['andrew', 'bob'], 
    'surname': ['smith','richardson']
    }

我在这里做什么的解释。我正在将html表解析为json,我没有找到比创建两个列表更好的方法-一个是标头,一个是完整数据,然后我要从两个列表中创建一个json。

4 个答案:

答案 0 :(得分:3)

itertools中可能有一些函数可以使其更简单。

我将数据拆分为较小的部分,并使用zip(header, part)创建对(键,val),并将其添加到字典中

table_headers = ['name', 'surname']
table_data = ['andrew', 'smith', 'bob', 'richardson']

len_headers = len(table_headers)
len_data = len(table_data)

result = dict()

for x in range(0, len_data, len_headers):
    for key, val in zip(table_headers, table_data[x:x+len_headers]):
        if key not in result:
            result[key] = []
        result[key].append(val)

print(result)

结果

{'name': ['andrew', 'bob'], 'surname': ['smith', 'richardson']}

编辑:与itertools.cycle()相同

import itertools

table_headers = ['name', 'surname']
table_data = ['andrew', 'smith', 'bob', 'richardson']

result = dict()

for key, val in zip(itertools.cycle(table_headers), table_data):
    if key not in result:
        result[key] = []
    result[key].append(val)

print(result)

编辑:,使用defaultdict()

import itertools
import collections

table_headers = ['name', 'surname']
table_data = ['andrew', 'smith', 'bob', 'richardson']

result = collections.defaultdict(list)

for key, val in zip(itertools.cycle(table_headers), table_data):
    result[key].append(val)

print(result)

import json
print(json.dumps(result))

答案 1 :(得分:1)

假设可以保证表数据具有正确数量的数据条目以创建偶数行(根据您的标头计数)

您可以使用旧的json包,然后创建所需的内容

import json 
# a very nice python package 

d = {header: table_data[i::len(table_headers)] for i,header in 
enumerate(table_headers)}


return json.dumps(d)

答案 2 :(得分:0)

您需要遍历pathofvbscript = "C:\\Users\\Deepanshu\\Documents\\border.vbs" shell(shQuote(normalizePath(pathofvbscript)), "cscript", flag = "//nologo") 列表,或者为table_data选择要添加到列表的值,对于name,字典中的值将是一个列表包含所有姓名和姓氏

surname

输出将如下所示。

table_headers = ['name', 'surname']
table_data = ['andrew', 'smith', 'bob', 'richardson']

dct = {}
idx = 0
for data in table_data:
    key = table_headers[idx]
    #Create value as a list
    if key in dct.keys():
        dct[key].append(data)
    else:
        dct[key] = [data]
    #We need to make sure index of list rolls over to pick the correct element in table_data
    idx = int((idx+1)%2)

{'name': ['andrew', 'bob'], 'surname': ['smith', 'richardson']}

答案 3 :(得分:0)

您可以在本地执行(无需任何导入或特殊功能),如下所示:

table_headers = ['name', 'surname']
table_data = ['andrew', 'smith', 'bob', 'richardson']
num_of_cols = len(table_headers)
cols = [[x for x in table_data[i::num_of_cols]] for i in range(num_of_cols)]
print(dict(zip(table_headers, cols)))
## {'name': ['bob', 'andrew'], 'surname': ['smith', 'richardson']}

添加更多数据:

table_data.extend(['john', 'doe'])
cols = [[x for x in table_data[i::num_of_cols]] for i in range(num_of_cols)]
print(dict(zip(table_headers, cols)))  
## {'name': ['andrew', 'bob', 'john'], 'surname': ['smith', 'richardson', 'doe']}

添加更多标题列:

table_headers = ['name', 'surname', 'middle_initial']
table_data = ['andrew', 'smith', 'a.','bob', 'richardson', 'b.']
num_of_cols = len(table_headers)
cols = [[x for x in table_data[i::num_of_cols]] for i in range(num_of_cols)]
print(dict(zip(table_headers, cols)))  
## {'name': ['andrew', 'bob'], 'surname': ['smith', 'richardson'], 'middle_initial': ['a.', 'b.']}