Python 切片一个命名的整数

Python 切片一个命名的整数,python,namedtuple,Python,Namedtuple,我有一个要切片的命名元组: >>> from collections import namedtuple >>> coords = namedtuple('coords', ['lng', 'lat', 'alt']) >>> everest = coords(86.92, 27.97, 8848) 因此,现在我可以轻松访问属性 >>> everest.alt 8848 但是,当我只想使用经度和纬度时(例如,在某些几何算

我有一个要切片的命名元组:

>>> 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'
旗帜=珠穆朗玛峰[:2] >>>flag.lat 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 AttributeError:“tuple”对象没有属性“lat”
我想知道是否可以对namedtuple进行切片并单独保留切片部分的属性。

您可以为此编写一个助手方法,将自定义的
\uuu getitem\uuu
附加到所创建的namedtuple类。
\uuuu getitem\uuuu
每次都会创建一个新类,但使用切片的参数数量较少

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)

不是现在。为命名元组类生成的
\uuu getitem\uuu
方法没有实现为返回值生成新的适当类所需的逻辑。可能不是最佳的数据结构。换一个字典吧?我使用元组,因为我可能想把它用作一个DIKT中的一把钥匙,所以我需要一些不可变的东西。如果你“想使用经度和纬度”,那就用经度和纬度。为什么需要切掉第三个属性?为什么不使用属性(通过
@property
)位置创建一个类?