参考列表的一部分 - Python

时间:2009-11-24 08:15:26

标签: python list

如果我在python中有一个列表,我该如何创建对部分列表的引用?例如:

myList = ["*", "*", "*",  "*", "*", "*", "*", "*", "*"]

listPart = myList[0:7:3] #This makes a new list, which is not what I want

myList[0] = "1"

listPart[0]

"1"

这是可能的,如果可以,我将如何编码呢?​​

干杯, 乔

4 个答案:

答案 0 :(得分:3)

使用切片对象还是islice迭代器?

http://docs.python.org/library/functions.html#slice

答案 1 :(得分:3)

您可以编写列表视图类型。这是我作为实验写的东西,它绝不是完整的或没有错误的

class listview (object):
    def __init__(self, data, start, end):
        self.data = data
        self.start, self.end = start, end
    def __repr__(self):
        return "<%s %s>" % (type(self).__name__, list(self))
    def __len__(self):
        return self.end - self.start
    def __getitem__(self, idx):
        if isinstance(idx, slice):
            return [self[i] for i in xrange(*idx.indices(len(self)))]
        if idx >= len(self):
            raise IndexError
        idx %= len(self)
        return self.data[self.start+idx]
    def __setitem__(self, idx, val):
        if isinstance(idx, slice):
            start, stop, stride = idx.indices(len(self))
            for i, v in zip(xrange(start, stop, stride), val):
                self[i] = v
            return
        if idx >= len(self):
            raise IndexError(idx)
        idx %= len(self)
        self.data[self.start+idx] = val


L = range(10)

s = listview(L, 2, 5)

print L
print s
print len(s)
s[:] = range(3)
print s[:]
print L

输出:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<listview [2, 3, 4]>
3
[0, 1, 2]
[0, 1, 0, 1, 2, 5, 6, 7, 8, 9]

您可以在列表视图中分配索引,它将反映在基础列表中。但是,在列表视图中定义追加或类似操作没有意义。如果基础列表的长度发生变化,它也可能会中断。

答案 2 :(得分:2)

python中没有任何东西可以真正做到你想要的。基本上你想写一些代理对象。

答案 3 :(得分:1)

我认为这是不可能的。这会导致许多可能的错误,例如:当您附加列表时,什么是引用更大列表的一部分?是否应该替换或插入大列表中的下一个元素?

据我所知,silce是获取列表元素的内部机制。它们不会创建新的列表对象,而是引用旧列表对象的一部分。 Islice只是遍历slice给出的元素,它也不是引用,但实际的对象 - 更改它不会影响原始列表。或者我错了?

正如评论中所说,这个解决方案真的对巴斯蒂安先生有所贡献,你可以这样做:

sliceobject = slice(0,7,3)
for i in xrange(sliceobject.start, sliceobject.stop, sliceobject.step)
    myList[i] = whatever

这样您就可以通过引用访问列表中的每个指定元素。