Форум сайта python.su
привет, никак не могу найти где описывается аналог PHP ф-ции array_splice (именно splice, а не слайс). Подскажите, как это можно сделать минимальным количеством телодвижений (в идеале, как PHP - всего одной функцией)
так же, интересует, как сделать слайс массива, но не используя питон нотацию . а по-человечески - через функцию или метод
спасибо!
Офлайн
1)
del array[x:y:z]
from functools import getslice
getslice(array, x, y)
array.__getslice__(x,y)
Отредактировано (Май 23, 2011 18:37:51)
Офлайн
Такую функцию и самому можно написать, спрятав нотации внутри, но зачем???
php:
$input = array("red", "green", "blue", "yellow");
array_splice($input, 2);
// $input is now array("red", "green")
python:
a = ["red", "green", "blue", "yellow"]
a = a[:2]
php:
array_splice($input, 1, -1);
// $input is now array("red", "yellow")
python:
del a[1:-1]
php:
array_splice($input, 1, count($input), "orange");
// $input is now array("red", "orange")
python:
a[1:] = ['orange']
php:
array_splice($input, -1, 1, array("black", "maroon"));
// $input is now array("red", "green", "blue", "black", "maroon")
python:
a[-1:]=["black", "maroon"]
php:
array_splice($input, 3, 0, "purple");
// $input is now array("red", "green", "blue", "purple", "yellow");
python:
a.insert(3, 'purple')
Офлайн
ясно, спасибо. Просто хотелось найти встроенную, так как по идее должно быстрее работать.
В случае способов типа a = a и т.д. будет создана копия всего массива (списка, последовательноси в общем), как я понимаю, и уже от её начала будут взяты элементы. Если это не так, то нотация устраивает в принципе всем, так как более идеологически правильнее, в питом это делать именно таким оператором slice, только насколько это оптимально по сравнению с кажем, если бы существовала встроенная ф-ция а-ля array_splice ?
Офлайн
talatalaЭто и есть вызов метода __getitem__(self, key) которому передаётся число находящееся в квадратных скобках или объект класса Slise.
только насколько это оптимально по сравнению с кажем, если бы существовала встроенная ф-ция а-ля array_splice ?
Офлайн
talatalaНет, не должно.
Просто хотелось найти встроенную, так как по идее должно быстрее работать.
talatalaНет, это не так.
В случае способов типа a = a и т.д. будет создана копия всего массива (списка, последовательноси в общем), как я понимаю, и уже от её начала будут взяты элементы.
Офлайн
ок, спасибо, тогда, что бы полностью разобраться чуть изменю вопрос: подскажите наиболее быструю конструкцию, которая будет брать заданное кол-во элементов с начала списка (в принципе любой последовательности и collection) с их удалением из этого списка, без неявных копирований. То есть не сильно расходующая память и процессор.
a = a
всё-равно будет копировать срез списка a в объект a создавая его заново при каждом присваивании ?
в идеале хочу чего-то вроди:
a = [1, 2, 3, 4, 5, 6, 7, 8]
while len(my_slice = array_shift(a, 2)) :
pass
Офлайн
Было бы неплохо полнее раскрыть задачу. Это какой то “moving average” или еще что-то? Возможно лучше использовать итератор или же нет. Зачем создавать my_slice (а не брать данные из списка ) в вашем примере в каждой итерации, и что с ним будет дальше.
Офлайн
> То есть не сильно расходующая память и процессор.
> a = a
Оно и есть - будет работать быстро, а часть памяти высвободиться.
И вообще вы не с того конца начали, за оптимизацию надо браться в конце, и то если будет тормозить.
Офлайн