将namedtuple映射为字典

时间:2017-04-06 21:10:57

标签: python collections

是否有一种简单的方法来映射/理解像

这样的命名元组
[k + v for k,v in namedtuple]

我觉得我可以使用asDict为此编写一个简单的地图函数,但是对于理解是怎样的。

1 个答案:

答案 0 :(得分:0)

我们必须更多地了解namedtuple数据使用列表理解的内容。

或者,更广泛的方法是使用递归函数来解包嵌套数据结构:

def reducer(obj):
    if isinstance(obj, dict):
        return {key: reducer(value) for key, value in obj.items()}
    elif isinstance(obj, list):
        return [reducer(value) for value in obj]
    elif isnamedtupleinstance(obj):  # see note
        return {key: reducer(value) for key, value in obj._asdict().items()}
    elif isinstance(obj, tuple):
        return tuple(reducer(value) for value in obj)
    else:
        return obj

注意:如果你的namedtuple包含其他的命名元组,那么你需要这个帮助方法check for instances of namedtuples,所以它们不会被误认为实际的元组:

def isnamedtupleinstance(x):
    _type = type(x)
    bases = _type.__bases__
    if len(bases) != 1 or bases[0] != tuple:
        return False
    fields = getattr(_type, '_fields', None)
    if not isinstance(fields, tuple):
        return False
    return all(type(i)==str for i in fields)