python - 创建一个包含 4 个键的字典,从列表中分配值
问题描述
我有一个包含 400 多个项目的列表,但我最终需要将其解析为具有 4 列的 pandas 数据框。所以我认为最好转换列表,以便 4 个项目中的每一个都从列表中接收到适当的值。
list = ['1','ABC','ABC001,'ABC002,'2','ABC','ABC001','ABC003','3','DEF','DEF001','DEF001']
我想制作一个如下所示的字典:
Dict = {'Id' : '1', 'TopSite' : 'ABC', 'Floor' : 'ABC001', 'Room' : 'ABC002', 'Id' : '2'.... }
所以我尝试了以下方法:
columns = ['Id', 'TopSite', 'Floor', 'Room']
list = ['1','ABC','ABC001,'ABC002,'2','ABC','ABC001','ABC003','3','DEF','DEF001','DEF001']
DataDict = [dict(zip(columns, regionDataList))]
问题是它只给了我字典列表中的前 4 个项目。
解决方案
您只是缺少一个遍历列表的步骤,因此您可以dict(zip(...))
为与列数相对应的每个项目块重复(假设您真正想要的是一个字典列表 - 与您的示例输出有点不同)。就像是:
cols = ['Id', 'TopSite', 'Floor', 'Room']
items = ['1','ABC','ABC001','ABC002','2','ABC','ABC001','ABC003','3','DEF','DEF001','DEF001']
results = [dict(zip(cols, items[i:i + len(cols)])) for i in range(0, len(items), len(cols))]
print(results)
# OUTPUT
# [{'Id': '1', 'TopSite': 'ABC', 'Floor': 'ABC001', 'Room': 'ABC002'}, {'Id': '2', 'TopSite': 'ABC', 'Floor': 'ABC001', 'Room': 'ABC003'}, {'Id': '3', 'TopSite': 'DEF', 'Floor': 'DEF001', 'Room': 'DEF001'}]
当然,如果您的目标是转换为数据框,您真的不需要中间步骤。您可以通过将列列表作为参数以及项目列表的分块版本传递到那里。例如:
import pandas as pd
cols = ['Id', 'TopSite', 'Floor', 'Room']
items = ['1','ABC','ABC001','ABC002','2','ABC','ABC001','ABC003','3','DEF','DEF001','DEF001']
chunks = [items[i:i + len(cols)] for i in range(0, len(items), len(cols))]
df = pd.DataFrame(chunks, columns=cols)
print(df)
# OUTPUT
# Id TopSite Floor Room
# 0 1 ABC ABC001 ABC002
# 1 2 ABC ABC001 ABC003
# 2 3 DEF DEF001 DEF001
len(...)
顺便说一句,如果您使用变量处理位而不是在推导式中一遍又一遍地运行它们,那么对于大型列表,这两个示例都将运行得更快。
推荐阅读
- java - Flink TaskManager 没有重新连接到新的 Jobmanager
- powershell - Powershell - Sendkeys - 多次发送相同的密钥
- neo4j - windows下无法安装neo4j 3.3.6/3.4.4社区版
- c# - 游戏文本输入框和按钮没有响应
- go - 如何在保留原始请求上下文的值的同时将 Context 传递给 r.WithContext?
- python - 大熊猫每个类别的计算
- java - nullpointexception:将数据插入firebase数据库时出错
- android - 本地化在 Marshmallow 及以下版本中不起作用
- c# - 如何在 Serenity MVC 框架上创建 TAB
- javascript - 将道具传递给子组件时如何避免未知道具错误?