为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨魅力 2019-10-30 14:55:57
我有很多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;
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

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


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)]

这有一些局限性(不支持“切片”),但对于大多数目的来说可以。


为了使这个序列R / W你需要添加__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


查看完整回答
反对 回复 2019-10-30
?
守着一只汪

TA贡献1872条经验 获得超3个赞

也许只使用一个numpy数组:


In [19]: import numpy as np


In [20]: l=np.arange(10)

基本切片numpy数组返回一个view,而不是一个副本:


In [21]: lv=l[3:6]


In [22]: lv

Out[22]: array([3, 4, 5])

改变l影响lv:


In [23]: l[4]=-1


In [24]: lv

Out[24]: array([ 3, -1,  5])

改变lv影响l:


In [25]: lv[1]=4


In [26]: l

Out[26]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])


查看完整回答
反对 回复 2019-10-30
  • 3 回答
  • 0 关注
  • 703 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信