>> l = range(10) >>> lv = l[3:6] >>> lv [3, 4, 5] -6ren">
gpt4 book ai didi

python - 我可以在 Python 列表上创建 "view"吗?

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:08 24 4
gpt4 key购买 nike

我有一个很大的列表l。我想创建一个从元素 4 到 6 的 View 。我可以使用序列切片来完成。

>>> l = range(10)
>>> lv = l[3:6]
>>> lv
[3, 4, 5]

但是 lvl 的一个切片的副本。如果我更改基础列表,lv 不会反射(reflect)更改。

>>> l[4] = -1
>>> lv
[3, 4, 5]

反之亦然,我希望对 lv 的修改也反射(reflect)在 l 中。除此之外,列表大小不会改变。

我不希望建立一个大类来做这件事。我只是希望其他 Python 大师可能知道一些隐藏的语言技巧。理想情况下,我希望它可以像 C 中的指针运算:

int lv[] = l + 3;

最佳答案

Python 标准库中没有“list slice”类(也没有内置)。因此,您确实需要一个类,尽管它不需要很大——尤其是当您对“只读”和“紧凑”切片感到满意时。例如:

import collections

class ROListSlice(collections.Sequence):

def __init__(self, alist, start, alen):
self.alist = alist
self.start = start
self.alen = alen

def __len__(self):
return self.alen

def adj(self, i):
if i<0: i += self.alen
return i + self.start

def __getitem__(self, i):
return self.alist[self.adj(i)]

这有一些限制(不支持“切片”),但对于大多数用途来说可能没问题。

要使此序列可读/可写,您需要添加 __setitem____delitem__insert:

class ListSlice(ROListSlice):

def __setitem__(self, i, v):
self.alist[self.adj(i)] = v

def __delitem__(self, i, v):
del self.alist[self.adj(i)]
self.alen -= 1

def insert(self, i, v):
self.alist.insert(self.adj(i), v)
self.alen += 1

关于python - 我可以在 Python 列表上创建 "view"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27090530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com