python - 如何在 Python 中将 [[A, B], [A, C], [A, D]] 列表转换为 {A: [B, C, D]} 字典?
问题描述
假设我们有一个列表列表,其中嵌套列表包含两个元素 [A, B]。现在,您想将这样的列表转换为字典,其中第一个元素应该是键,第二个元素应该是它的值。例如:
[['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'B1'], ['B', 'C1'], ['C', 'B2'], ['C', 'C2'], ['C', 'D2']] -->
{'A': ['B', 'C', 'D'], 'B': ['B1', 'C1'], 'C': ['B2', 'C2', 'D2']}
应保持值的顺序。
我有一个简单的解决方案:
lst = [['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'B1'], ['C', 'C1']]
dic = {}
for el in lst:
if dic.get(el[0]) is None:
dic[el[0]] = [el[1]]
continue
dic[el[0]].append(el[1])
还有一个丑陋的列表理解解决方案,它的速度要慢得多,因为它对每个键的完整数据执行循环。
dic = dict([(el[0], [e[1] for r in lst if e[0] == el[0]])
for el in lst])
应该有更好、更优雅的方法来做到这一点。你能想出点什么吗?
解决方案
使用默认字典:
from collections import defaultdict
dic = defaultdict(list)
for k, v in lst:
dic[k].append(v)
推荐阅读
- excel - 用于绘制具有给定起点和终点的图形的 VBA 代码
- python - Celery AsyncResult 没有父母
- google-cloud-platform - 在 Google Cloud 上安排 Twillio 消息
- php - Elementor 与 Ekommart 主题冲突
- r - 一个接一个地执行反应式表达式 - R Shiny
- c# - 如何使用 OpenXml 在工作表视图中更改选择活动单元格?
- javascript - CHROME Javascript CONSOLE 的奇怪行为
- javascript - 打印咖喱函数不显示捕获的参数
- bash - 如何使用 bash 从脚本中删除一组已知行(整个函数)...?
- python - 如何从 2 个单独的列表中返回一对索引?