有没有可能在另一个namedtuple中包含一个namedtuple?例如:
namedtuple
from collections import namedtuple Position = namedtuple('Position', 'x y') Token = namedtuple('Token', ['key', 'value', Position])
其给出 "值错误:类型名称和字段名称必须是有效的标识符"此外,我很好奇是否有一个更 * Python的方法 * 来构建这样一个嵌套容器?
fwzugrvs1#
您混淆了两个概念-namedtuple的结构和分配给它们的值。结构需要唯一名称的列表。值可以是任何内容,包括另一个namedtuple。
from collections import namedtuple Position = namedtuple('Position', 'x y') Token = namedtuple('Token', ['key', 'value', 'position']) t = Token('ABC', 'DEF', Position(1, 2)) assert t.position.x == 1
bd1hkmkf2#
下面是一个将嵌套字典转换为嵌套命名元组的通用函数
dfrom collections import namedtuple def dict2namedtuple(name, d): values, keys = [], [] for k in d: keys.append(k) v = d[k] if isinstance(v, dict): values.append(dict2namedtuple(k, v)) else: values.append(v) T = namedtuple(name, keys) return T(*values) def namedtuple2dict(nt): d = {} for k in nt._fields: v = getattr(nt, k) try: d[k] = namedtuple2dict(v) except AttributeError: d[k] = v return d test_dict = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}} nt = dict2namedtuple('test', d=test_dict) dc = namedtuple2dict(nt) assert dc == test_dict print('namedtuple', nt) print('dict', dc)
编辑:我为反问题namedtuple2dict添加了一个函数。根据我的经验,namedtuple._asidct()工作正常,但@Chev_603提到了一些问题。
namedtuple2dict
namedtuple._asidct()
2条答案
按热度按时间fwzugrvs1#
您混淆了两个概念-
namedtuple
的结构和分配给它们的值。结构需要唯一名称的列表。值可以是任何内容,包括另一个namedtuple
。bd1hkmkf2#
下面是一个将嵌套字典转换为嵌套命名元组的通用函数
编辑:我为反问题
namedtuple2dict
添加了一个函数。根据我的经验,namedtuple._asidct()
工作正常,但@Chev_603提到了一些问题。