使用namedtup嵌套

2024-09-30 12:16:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我在获取python中想要的格式的数据时遇到了困难。在

基本上提供了一个二进制数据分析程序。在

我的数据有主标题和副标题,可以是任意数量的不同数据类型。在

我希望能够访问我的数据,例如:

>>> a = myDatafile.readit()
>>> a.elements.hydrogen.distributionfunction
(a big array)
>>> a.elements.hydrogen.mass
1
>>> a.elements.carbon.mass
12

但直到运行时我才知道原子的名字。在

我尝试过使用namedtuple,例如在我读入所有atom名称之后:

^{pr2}$

其中elementlist是字符串的列表,例如('hydrogen','carbon')。但问题是我不能嵌套这些,例如:

for i in range(0,self.nelements):
    self.elements[i] = namedtuple('details',['ux','uy','uz','mass','distributionfunction'])

然后通过例如

self.elements.electron.distributionfunction.

也许我完全错了。我对python相当缺乏经验。我知道如果我不介意动态地命名变量,这将很容易实现。在

我希望我已经清楚地表明了我要达到的目标!在


Tags: 数据self程序标题数量格式二进制elements
3条回答

在不知道你的数据的情况下,我们只能给出一个通用的解决方案。在

考虑到前两行包含了标题和子标题,您以某种方式确定了层次结构。你所要做的就是创建一个层次词典。在

例如,扩展您的示例

data.elements.hydrogen.distributionfunction
data.elements.nitrogen.xyzfunction
data.elements.nitrogen.distributionfunction
data.compound.water.distributionfunction
data.compound.hcl.xyzfunction

所以我们必须创建一个这样的字典

^{pr2}$

如何填充字典取决于现在很难说出的数据。 但是字典的键应该从头中填充,并且你必须将数据映射到字典的空槽中的相应值。在

填充地图后,您可以将其作为

 yourDict['data']['compound']['hcl']['xyzfunction']

如果元素名是动态的,并且在运行时从数据中获取,那么可以将它们分配给dict并像这样进行访问

elements['hydrogen'].mass

但是如果你想要点式符号,你可以在运行时创建属性

^{pr2}$

这里我假设你有数据,但是用任何其他格式的数据,你可以做类似的把戏

下面是一个从嵌套数据递归创建namedtuples的方法。在

from collections import Mapping, namedtuple


def namedtuplify(mapping, name='NT'):  # thank you https://gist.github.com/hangtwenty/5960435
    """ Convert mappings to namedtuples recursively. """
    if isinstance(mapping, Mapping):
        for key, value in list(mapping.items()):
            mapping[key] = namedtuplify(value)
        return namedtuple_wrapper(name, **mapping)
    elif isinstance(mapping, list):
        return [namedtuplify(item) for item in mapping]
    return mapping

def namedtuple_wrapper(name, **kwargs):
    wrap = namedtuple(name, kwargs)
    return wrap(**kwargs)


stuff = {'data': {'elements': {'hydrogen': {'distributionfunction': 'foo'}, 
  'nitrogen': {'xyzfunction': 'bar', 
    'distributionfunction': 'baz'}
  },
  'compound': {'water': {'distributionfunction': 'lorem'}, 
    'hcl': {'xyzfunction': 'ipsum'}}}
 }

example = namedtuplify(stuff)

example.data.elements.hydrogen.distributionfunction  # 'foo'

相关问题 更多 >

    热门问题