我正在从XML文件中提取三个元素的实例:ComponentStr,keyID和valueStr。每当我找到ComponentStr时,我都想添加/关联keyID:valueStr。 ComponentStr值不是唯一的。当读取到多次出现的ComponentStr时,我想为该ComponentStr组累积keyID:valueStr。读取XML文件后生成的累积数据结构可能如下所示:

组件A:键1:值1,键2:值2,键3:值3

ComponentB:key4:value4

组件C:key5:value5,key6:value6

生成最终的数据结构后,我想对每个ComponentStr中的keyID:valueStr条目进行排序,并对所有ComponentStr进行排序。

我正在尝试在Python 2中构造此数据。ComponentStr似乎可以很好地工作。 keyID:valueStr显然是一个字典。但是,如何将集合中的ComponentStr条目与其dict条目相关联?

或者,除了集合和相关的dict条目之外,还有没有更好的方法来组织此数据?每个keyID都是唯一的。也许我可以对keyID做出一个决定:ComponentStr和valueStr的某种组合?建立数据结构后,我可以首先基于ComponentStr对其进行排序,然后执行某种类型的切片将keyID:valueStr分组,然后再次对keyID进行排序?似乎很复杂。

最佳答案

一份命令如何?

data = {
'ComponentA': {'key1':'value1', 'key2':'value2', 'key3':'value3'},
'ComponentB': {'key4':'value4'},
'ComponentC': {'key5':'value5', 'key6':'value6'},
}


它维护您的数据结构和映射。有趣的是,dict的基础实现类似于集合的实现。

这个伪代码很容易构造:

data = {}
for file in files:
    data[get_component(file)] = {}
    for key, value in get_data(file):
        data[get_component(file)][key] = value


如果您有重复的组件,则需要将子字典作为默认值,但如果有则添加到上一个。我更喜欢setdefault而不是其他解决方案,例如defaultdict或带有__missing__的子类dict,只要在代码中只需执行一次或两次即可:

data = {}
for file in files:
    for key, value in get_data(file):
        data.setdefault([get_component(file)], {})[key] = value


它是这样的:

>>> d = {}
>>> d.setdefault('foo', {})['bar'] = 'baz'
>>> d
{'foo': {'bar': 'baz'}}
>>> d.setdefault('foo', {})['ni'] = 'ichi'
>>> d
{'foo': {'ni': 'ichi', 'bar': 'baz'}}


或者,当我阅读您对其他答案的评论时说,您需要简单的代码时,可以使用一些更加冗长且优化程度较低的代码来使其保持真正的简单:

data = {}
for file in files:
    for key, value in get_data(file):
        if get_component(file) not in data:
            data[get_component(file)] = {}
        data[get_component(file)][key] = value


然后,您可以在收集完数据后进行排序。

for component in sorted(data):
    print(component)
    print('-----')
    for key in sorted(data[component]):
        print(key, data[component][key])

07-24 19:38