python - 列表到字典:有重复的元素将充当键,但我想针对同一个键收集值并将其转换为列表值
问题描述
我有这个清单:
['Leistung', '15 kW', 'Farbe', 'Rot', 'Hersteller', 'Peugeot', 'Leistung', '25 kW', 'Hersteller', 'VW Nordamerika und Europa']
(我通过制作解析器从 xml 文件中获取此列表)并且我想将其转换为这样的字典:
{'Leistung': ['15 kW','25 kW'], 'Farbe': 'Rot', 'Hersteller': ['Peugeot','VW Nordamerika und Europa']}
我是 python 新手,我尝试了很多代码,但它不起作用
以下是解析器从 xml 文件中获取列表的代码:
import os
from xml.etree import ElementTree
file_name = 'data.xml'
full_file = os.path.abspath(os.path.join('data', file_name))
dom = ElementTree.parse(full_file)
autos = dom.findall('auto')
n = 6
dictionary = {}
mylist = []
for a in range(n):
for c in autos:
key = c.find('Key')
value = c.find('Value')
mylist.append(key.text)
mylist.append(value.text)
break
print(mylist)
解决方案
这意味着不需要索引/范围,也不需要检查键是否存在
from collections import defaultdict
lst = ['Leistung', '15 kW', 'Farbe', 'Rot', 'Hersteller', 'Peugeot', 'Leistung', '25 kW', 'Hersteller', 'VW Nordamerika und Europa']
res = defaultdict(list)
for k,v in zip(*[iter(lst)]*2):
res[k].append(v)
print(res)
生产
defaultdict(<class 'list'>, {'Leistung': ['15 kW', '25 kW'], 'Farbe': ['Rot'], 'Hersteller': ['Peugeot', 'VW Nordamerika und Europa']})
当然,假设是输入成对出现(键和值),根据您的描述
进一步说明:如果您想知道这个古怪的 zip 的作用以及它是如何工作的,请阅读这里
推荐阅读
- graphviz - 如何使用 Graphviz 跳过一行?
- postgresql - 无法将 Postgres 数据库从 12.3 升级到 13.2
- xml - 如何将子查询用作变量并在返回查询中使用变量 - Postgres 函数
- pyspark - 无法在火花中导入模块
- apache-zookeeper - Zookeeper:异步写入后立即读取
- java - 如何为邮件实际配置 Microsoft Graph API
- powershell - ColorDialog - 如何检查是否已按下取消或 X
- entity-framework-core - Entity Framework Core 生成迁移而不更改域
- java - 使 Spring ConstraintValidator 抛出异常或返回 400 以外的其他代码
- reactjs - 不应有附加属性“nodeModulesPath”