将 3 个列表解析为 python 中的字典列表

parsing 3 lists into list of dictionaries in python

我正在逐行解析 csv。一行中有 3 列需要分别拆分成列表,然后组合成列表中的字典。每列中的数据由两个管道分隔:||

传入数据:

按钮,点击,id
选择1 ||选择2 ||选择 3,真 ||假 || FALSE,选择 1 id||选择2 ID ||选择 3 id

('buttons','choice 1 || choice 2 || choice 3'),
('clicked', 'TRUE || FALSE || FALSE'),
('id','choice 1 id|| choice 2 id || choice 3 id'),

编辑添加
输入有更多不应包含的列。此步骤仅包括这 3 列。

即正在处理的行的示例输出

print(data[0])

OrderedDict([
('pathId', 'test_id'),
('stepId', ''),
('nodeId', 'ROOT'),
('responseId', 'test_response'),
('responseUuid', ''),
('type', ''),
('language', 'en-US'),
('buttons','choice 1 || choice 2 || choice 3'),
('clicked', 'TRUE || FALSE || FALSE'),
('id','choice 1 id|| choice 2 id || choice 3 id'),
('state', 'resolved'),
('flags', 'accepted')])

实际的列数是动态的且不可预测的。但是在包含 buttonsclickedid 值的行中将需要此处理。
结束编辑

此行的预期输出需要为:

buttonChoices =
[
    {
        "button": "choice 1",
        "clicked": true,
        "id": "choice 1 id"
    },
    {
        "button": "choice 2",
        "clicked": false,
        "id": "choice 2 id"
    },
    {
        "button": "choice 3",
        "clicked": false,
        "id": "choice 3 id"
    }
]

现在我有:

for row in data:
    buttonChoices = []
    buttonText = row['button'].split('||')
    buttonClicked = row['clicked'].split('||')
    buttonId = row['id'].split('||')

但无法进行下一步

如果我对问题的理解正确,那么这应该可行。

    button_choices = []
    for row in data:
        button_texts = row['button'].split('||')
        button_clickeds = row['clicked'].split('||')
        button_ids = row['id'].split('||')
        for button_text, button_clicked, button_id in zip(button_texts, button_clickeds, button_ids):
            button_choices.append({
                'button': button_text,
                'clicked': button_clicked,
                'id': button_id
            })

您可以使用 zip 将值 3 乘 3 组合并将它们关联到一个键:

data = dict([ ('buttons','choice 1 || choice 2 || choice 3'),
              ('clicked', 'TRUE || FALSE || FALSE'),
              ('id','choice 1 id|| choice 2 id || choice 3 id')])

buttonChoices = [ dict(zip(data,map(str.strip,values)))
                  for values in zip(*(v.split("||") for v in data.values())) ]

print(buttonChoices)
[{'buttons': 'choice 1', 'clicked': 'TRUE', 'id': 'choice 1 id'},
 {'buttons': 'choice 2', 'clicked': 'FALSE', 'id': 'choice 2 id'},
 {'buttons': 'choice 3', 'clicked': 'FALSE', 'id': 'choice 3 id'}]

注意:我在其中添加了一个 map(str.strip,...) 来清理混乱的字符串分隔,但如果您的实际数据格式正确,则不需要它

为了概括这一点,您可以定义输入键和输出键以根据需要进行过滤和重命名:

inKeys  = ('buttons','clicked','id')
outKeys = ('button','clicked','id')
buttonChoices = [ dict(zip(outKeys,map(str.strip,values)))
                  for values in zip(*(data[k].split("||") for k in inKeys)) ]

print(buttonChoices)
[{'button': 'choice 1', 'clicked': 'TRUE', 'id': 'choice 1 id'},
 {'button': 'choice 2', 'clicked': 'FALSE', 'id': 'choice 2 id'},
 {'button': 'choice 3', 'clicked': 'FALSE', 'id': 'choice 3 id'}]