Python 如何使用列表理解从嵌套字典中提取

Python 如何使用列表理解从嵌套字典中提取,python,xml,list-comprehension,Python,Xml,List Comprehension,我试图从XML中提取一些数据。我使用将数据加载到字典中,然后使用列表理解将各个部分提取到单独的列表中。稍后我将使用matplotlib绘制这些 XML: 输出: sess_ids: [u'1234', u'5678'] sess_loads: [u'23', u'28'] trans_ids: [[u'2103645570', u'4315547431'], [u'4099381642', u'1220404184', u'201506542']] 您可以看到,我可以从会话元素访问

我试图从XML中提取一些数据。我使用将数据加载到字典中,然后使用列表理解将各个部分提取到单独的列表中。稍后我将使用matplotlib绘制这些

XML:

输出:

sess_ids:    [u'1234', u'5678']
sess_loads:  [u'23', u'28']
trans_ids:   [[u'2103645570', u'4315547431'], [u'4099381642', u'1220404184', u'201506542']]
您可以看到,我可以从会话元素访问ID属性,也可以从BEGIN元素访问LOAD属性

我需要从事务元素中以单个列表的形式获取ID属性。目前,我在变量
trans\u id
中得到一个列表

我怎样才能得到一个简单的值列表

我试过:

[j['@ID'] for j in i['TRANSACTION'] for i in doc['MYDATA']['SESSION']]
[j['@ID'] for j in i['TRANSACTION'] for i in doc['MYDATA']['SESSION']]
但这只会重复第二节课两次,给出:

[u'4099381642',
 u'4099381642',
 u'1220404184',
 u'1220404184',
 u'201506542',
 u'201506542']
我试过:

[j['@ID'] for j in i['TRANSACTION'] for i in doc['MYDATA']['SESSION']]
[j['@ID'] for j in i['TRANSACTION'] for i in doc['MYDATA']['SESSION']]
你差一点就成功了。只需反转零件中..的内部

>>> [j['@ID'] for i in doc['MYDATA']['SESSION'] for j in i['TRANSACTION']]
[u'2103645570', u'4315547431', u'4099381642', u'1220404184', u'201506542']
要了解这一点,请看以下示例:

>>> a = [[1, 2, 3], [4, 5, 6]]
>>> [j for j in i for i in a]
[4, 4, 5, 5, 6, 6]
>>> [j for i in a for j in i]
[1, 2, 3, 4, 5, 6]
当列表中有多个“
”部分时,将从左到右对其进行评估。因此,如果您的外观像这样:

for i in a:
    for j in i
        j
然后必须按相同的顺序指定,而不是从内部到外部:

[j for i in a for j in i]

你需要查字典有什么原因吗?这类事情在XML中非常简单:

import xml.etree.ElementTree as etree
txml = etree.parse('xml string above')
txml.findall('SESSION/TRANSACTION')
[<Element TRANSACTION at 0x4064f9d8>,
 <Element TRANSACTION at 0x4064fa20>,
 <Element TRANSACTION at 0x4064f990>,
 <Element TRANSACTION at 0x4064fa68>,
 <Element TRANSACTION at 0x4064fab0>]
[x.get('ID') for x in txml.findall('SESSION/TRANSACTION')]
['2103645570', '4315547431', '4099381642', '1220404184', '201506542']
将xml.etree.ElementTree导入为etree
txml=etree.parse('上面的xml字符串')
txml.findall('会话/事务')
[,
,
,
,
]
[x.get('ID')代表txml.findall('SESSION/TRANSACTION')中的x]
['2103645570', '4315547431', '4099381642', '1220404184', '201506542']

至少,我觉得它更简洁。

有什么理由需要使用列表理解吗?用一行以上的内容来构建结果列表没有什么错,可能是一个循环或者其他什么。事实上,不,这只是我迄今为止提出的最好的选择。我愿意接受更好的建议,我不是说这样更好;但是,如果你很难让列表理解工作起来,那么这肯定是一个很容易让你得到结果的方法。而且它也可能比一行很长的一行更可读。不过我正在寻找一些相当紧凑的东西。这是一个简化的示例—在真实的示例中,我在XML树的不同深度提取了大约30个不同的属性。啊哈,这就是我缺少的—我假设它是从右向左计算的,我还没有看到任何地方解释的顺序。谢谢。严格地说,这是我问题的正确答案,但是@corley brigman的答案实际上是我特定问题的更好解决方案。你能详细说明一下吗?你是说在我已经有了代码之后我才这么做?*的作用是什么?@andymage将
*
列表中的元素作为参数提供给函数。另见。
import xml.etree.ElementTree as etree
txml = etree.parse('xml string above')
txml.findall('SESSION/TRANSACTION')
[<Element TRANSACTION at 0x4064f9d8>,
 <Element TRANSACTION at 0x4064fa20>,
 <Element TRANSACTION at 0x4064f990>,
 <Element TRANSACTION at 0x4064fa68>,
 <Element TRANSACTION at 0x4064fab0>]
[x.get('ID') for x in txml.findall('SESSION/TRANSACTION')]
['2103645570', '4315547431', '4099381642', '1220404184', '201506542']