首页 > 解决方案 > 列表到字典:有重复的元素将充当键,但我想针对同一个键收集值并将其转换为列表值

问题描述

我有这个清单:

['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)

标签: pythonlistdictionary

解决方案


这是defaultdict的完美工作

这意味着不需要索引/范围,也不需要检查键是否存在

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 的作用以及它是如何工作的,请阅读这里


推荐阅读