猿问

我可以在Python列表上创建“视图”吗?

我有很多l。我想创建一个从元素4到6的视图。我可以使用序列切片来实现。


>>> l=range(10)

>>> lv=l[3:6]

>>> lv

[3, 4, 5]

但是lv是l切片的副本。如果更改基础列表,lv不会反映此更改。


>>> l[4] = -1

>>> lv

[3, 4, 5]

反之亦然,我也希望对lv的修改也反映在l中。除此之外,列表大小不会更改。


我不希望为此建立一个大型课程。我只是希望其他Python专家可能知道一些隐藏的语言技巧。理想情况下,我希望它能喜欢C语言中的指针算法。


int lv[] = l + 3;


杨魅力
浏览 704回答 3
3回答

莫回无

Python标准库中没有“列表切片”类(也不是内置的)。因此,您确实需要一个类,尽管它不必很大-尤其是如果您对“只读”和“紧凑”切片感到满意。例如:import collectionsclass ROListSlice(collections.Sequence):&nbsp; &nbsp; def __init__(self, alist, start, alen):&nbsp; &nbsp; &nbsp; &nbsp; self.alist = alist&nbsp; &nbsp; &nbsp; &nbsp; self.start = start&nbsp; &nbsp; &nbsp; &nbsp; self.alen = alen&nbsp; &nbsp; def __len__(self):&nbsp; &nbsp; &nbsp; &nbsp; return self.alen&nbsp; &nbsp; def adj(self, i):&nbsp; &nbsp; &nbsp; &nbsp; if i<0: i += self.alen&nbsp; &nbsp; &nbsp; &nbsp; return i + self.start&nbsp; &nbsp; def __getitem__(self, i):&nbsp; &nbsp; &nbsp; &nbsp; return self.alist[self.adj(i)]这有一些局限性(不支持“切片”),但对于大多数目的来说可以。为了使这个序列R / W你需要添加__setitem__,__delitem__和insert:class ListSlice(ROListSlice):&nbsp; &nbsp; def __setitem__(self, i, v):&nbsp; &nbsp; &nbsp; &nbsp; self.alist[self.adj(i)] = v&nbsp; &nbsp; def __delitem__(self, i, v):&nbsp; &nbsp; &nbsp; &nbsp; del self.alist[self.adj(i)]&nbsp; &nbsp; &nbsp; &nbsp; self.alen -= 1&nbsp; &nbsp; def insert(self, i, v):&nbsp; &nbsp; &nbsp; &nbsp; self.alist.insert(self.adj(i), v)&nbsp; &nbsp; &nbsp; &nbsp; self.alen += 1

守着一只汪

也许只使用一个numpy数组:In [19]: import numpy as npIn [20]: l=np.arange(10)基本切片numpy数组返回一个view,而不是一个副本:In [21]: lv=l[3:6]In [22]: lvOut[22]: array([3, 4, 5])改变l影响lv:In [23]: l[4]=-1In [24]: lvOut[24]: array([ 3, -1,&nbsp; 5])改变lv影响l:In [25]: lv[1]=4In [26]: lOut[26]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
随时随地看视频慕课网APP

相关分类

Python
我要回答