将 3 个列表解析为 python 中的字典列表
parsing 3 lists into list of dictionaries in python
我正在逐行解析 csv。一行中有 3 列需要分别拆分成列表,然后组合成列表中的字典。每列中的数据由两个管道分隔:||
传入数据:
按钮,点击,id
选择1 ||选择2 ||选择 3,真 ||假 || FALSE,选择 1 id||选择2 ID ||选择 3 id
- 数据已通过 csv DiskReader 导入,脚本中的每一行都是有序字典,如下所示:
('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')])
实际的列数是动态的且不可预测的。但是在包含 buttons
、clicked
和 id
值的行中将需要此处理。
结束编辑
此行的预期输出需要为:
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"
}
]
- 我事先不知道列表中会有多少个值,但这 3 列中的值是相同的
现在我有:
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'}]
我正在逐行解析 csv。一行中有 3 列需要分别拆分成列表,然后组合成列表中的字典。每列中的数据由两个管道分隔:||
传入数据:
按钮,点击,id
选择1 ||选择2 ||选择 3,真 ||假 || FALSE,选择 1 id||选择2 ID ||选择 3 id
- 数据已通过 csv DiskReader 导入,脚本中的每一行都是有序字典,如下所示:
('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')])
实际的列数是动态的且不可预测的。但是在包含 buttons
、clicked
和 id
值的行中将需要此处理。
结束编辑
此行的预期输出需要为:
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"
}
]
- 我事先不知道列表中会有多少个值,但这 3 列中的值是相同的
现在我有:
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'}]