迭代和过滤Python字典

时间:2018-02-20 11:01:21

标签: python dictionary elementtree

我已将XML文件解析为我所拥有的字典

{'NY240': {'Enable_Notifications': 'Enabled',
  'Interface': 'LAN 1/3/2',
  'ID': '5058',
  'Location': 'NY240'
  'Speed': '0',
  'Validity': '1',
  'updateDate': '2018-02-05 14:02:57'},
'SF440': {'Enable_Notifications': 'Enabled',
  'Interface': 'WAN 1/2/2',
  'ID': '6353',
  'Location': 'SF440'
  'Speed': '1',
  'Validity': '1',
  'updateDate': '2018-02-08 16:02:57'},
...}

我得到了:

import xml.etree.ElementTree as ET
tree = ET.parse('data_file.xml')
root = tree.getroot()

dict_s = {}
for child in root:
    for key in child:
        td={}
        for k in key:
            td.update({k.tag: k.text})
            if k.tag=='Location':
                dict_s.update({k.text:td})
        else:
            pass

我知道我没有在这里粘贴XML文件,但我认为没有必要,它是简单的XML文件,任何比我更好的python字典迭代的人都可以从这里开始。 我需要的是选择那些内键'Interface'的值包含'WAN'(不是'startswith')的键(及其值)。在这种情况下,将是第二个,SF440。

我已经解决了这个问题,分开了:

new_td = {}
for key, value in dict_s.iteritems():
    for k, v in value.iteritems():
        if k=='Interface' and 'WAN' in v:
            new_td.update({key: value})

但我正在寻找在顶级代码块中实现的解决方案,如果可能的话,不会分开?

1 个答案:

答案 0 :(得分:1)

使用python dict comprehension

dict_s = {'NY240': {'Enable_Notifications': 'Enabled',
  'Interface': 'LAN 1/3/2',
  'ID': '5058',
  'Location': 'NY240',
  'Speed': '0',
  'Validity': '1',
  'updateDate': '2018-02-05 14:02:57'},
'SF440': {'Enable_Notifications': 'Enabled',
  'Interface': 'WAN 1/2/2',
  'ID': '6353',
  'Location': 'SF440',
  'Speed': '1',
  'Validity': '1',
  'updateDate': '2018-02-08 16:02:57'},
}

print dict((key, value) for key, value in dict_s.items() if 'WAN' in value.get('Interface', None))

<强>输出:

{'SF440': {'Validity': '1', 'Interface': 'WAN 1/2/2', 'Location': 'SF440', 'Enable_Notifications': 'Enabled', 'Speed': '1', 'ID': '6353', 'updateDate': '2018-02-08 16:02:57'}}