切片一个namedtuple

时间:2017-07-26 12:08:23

标签: python namedtuple

我有一个我要切片的名字小组:

>>> from collections import namedtuple
>>> coords = namedtuple('coords', ['lng', 'lat', 'alt'])
>>> everest = coords(86.92, 27.97, 8848)

所以现在我可以轻松访问属性

>>> everest.alt
8848

但是,当我想使用经度和纬度时,(例如在一些几何算法中),我将切片元组

>>> flag = everest[:2]
>>> flag.lat
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'lat'

我想知道是否可以切片namedtuple并保留切片部分的属性。

1 个答案:

答案 0 :(得分:3)

您可以为此编写一个辅助方法,将自定义__getitem__附加到创建的namedtuple类。 __getitem__每次都会创建一个新类,但使用切片

的参数数量较少
from collections import namedtuple


def namedtuple_with_slice(name, args):
    cls = namedtuple(name, args)
    def getitem(self, index):
        # `type(self)` can result in issues in case of multiple inheritance.
        # But shouldn't be an issue here.
        value = super(type(self), self).__getitem__(index)
        if isinstance(index, slice):
            cls = namedtuple(name, args[index])
            cls.__getitem__ = getitem
            value = cls(*value)
        return value
    cls.__getitem__ = getitem
    return cls

<强>演示:

>>> coords = namedtuple_with_slice('coords', ['lng', 'lat', 'alt'])
>>> everest = coords(86.92, 27.97, 8848)
>>> everest[:1]
coords(lng=86.92)
>>> everest[:2]
coords(lng=86.92, lat=27.97)    
>>> everest[:3]
coords(lng=86.92, lat=27.97, alt=8848)    
>>> everest[:3][:2]
coords(lng=86.92, lat=27.97)