Ответ 1
Использовать объект среза или истребитель islice?
Если у меня есть список в python, как я могу создать ссылку на часть списка? Например:
myList = ["*", "*", "*", "*", "*", "*", "*", "*", "*"]
listPart = myList[0:7:3] #This makes a new list, which is not what I want
myList[0] = "1"
listPart[0]
"1"
Возможно ли это, и если да, то как мне его закодировать?
Cheers, Джо
Использовать объект среза или истребитель islice?
Вы можете написать тип вида списка. Вот что я написал в качестве эксперимента, он ни в коем случае не гарантированно будет полным или без ошибок
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]
Вы можете назначать индексы в списке, и он будет отражать основной список. Тем не менее, нет смысла определять append или подобные действия в listview. Он также может сломаться, если основной список изменяется по длине.
В python ничего нет, что действительно делает то, что вы хотите. В основном вы хотите написать какой-то прокси-объект.
Я думаю, что это невозможно. Это приведет ко многим возможным ошибкам, например: что, когда вы добавляете список, который ссылается на часть большего списка? Будет ли заменен следующий элемент в большом списке или вставлен?
Насколько я знаю, silce - это внутренний механизм для получения элементов списка. Они не создают новый объект списка, ссылаясь на части более старого объекта списка. Islice просто выполняет итерации над элементами, заданными срезом, это также не ссылка, но фактический объект - его изменение не влияет на исходный список. Или я ошибаюсь?
Как и в комментарии, и это решение действительно помогает г-ну Бастиену, вы можете сделать:
sliceobject = slice(0,7,3)
for i in xrange(sliceobject.start, sliceobject.stop, sliceobject.step)
myList[i] = whatever
Таким образом, вы можете получить доступ к каждому указанному элементу списка по ссылке.