有没有一种简单的方法来映射/理解命名元组,例如
[k + v for k,v in namedtuple]
我觉得我可以使用asDict为此编写一个简单的地图函数,但是对于理解呢。
我们必须更多地了解命名元组数据的外观才能使用列表推导。
或者,更广泛的方法是使用递归函数来解压缩嵌套的数据结构:
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
注意:如果你的命名元组包含其他命名元组,则需要这个帮助程序方法来检查命名元组的实例,这样它们就不会被误认为是实际的元组:
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)