如何处理将任意数量的列表解析为字典

How to deal with parsing an arbitrary number of lists into a dictionary

我首先将 XMI/XML 数据结构分解为字典,从而将其解析为 pandas 数据帧。当我在 XMI 的列表中遇到一个命名元组时,我的列表中似乎最多有两个命名元组(尽管大多数只有一个)。

为了处理这个案例,我正在做以下事情:

if val is not None and val:
    if len(val) == 1:
        d['modifiedBegin'] = val[0].begin
        d['modifiedEnd'] = val[0].end
        d['modifiedBegin1'] = None
        d['modifiedEnd1'] = None
    else:
        d['modifiedBegin1'] = val[1].begin
        d['modifiedEnd1'] = val[1].end

我的问题是:a) 我不能保证我正在分解的列表中只有两个列表,b) 这感觉很廉价、丑陋而且完全错误!

我真的很想提出一个更通用的解决方案,尤其是上面的 a) 项。

我的数据如下:

val = [Span(xmiID=105682, begin=13352, end=13358, type='org.metamap.uima.ts.Span'), Span(xmiID=105685, begin=13368, end=13374, type='org.metamap.uima.ts.Span')]

我真的更愿意将其解析为我的数据框中的两个单独的行,而不是有更多的列。主要问题是这两个元组共享来自一个更大对象的公共数据,如下所示:

Negation(xmiID=142613, id=None, negType='nega', negTrigger='without', modifier=[Span(xmiID=105682, begin=13352, end=13358, type='org.metamap.uima.ts.Span'), Span(xmiID=105685, begin=13368, end=13374, type='org.metamap.uima.ts.Span')]) 

因此,两行共享属性 negTypenegTrigger... 分解它以插入到我的数据框中的更通用的方法是什么。我想在列表的长度大于 1 时遍历元素,然后在每次迭代时插入数据帧,但这看起来很乱。

因此,我想要的结果是拥有一个看起来像(减去索引和其他常见垃圾)的数据框:

  • 遍历 Negation 个命名元组
    • 对于 negation.modifier 中的每件事
      • 使用否定属性和事物属性添加一行

或者不是将 XML 解析为命名元组到字典,而是跳过中间部分并创建单个字典 - {'begin':[row0,row1,...],'end':[row0,row1,...],'negtrigger':[row0,row1,...],'negtype':[row0,row1,...]} - 来自 XML