Найти - Пользователи
Полная версия: аналог array_splice в python
Начало » Python для новичков » аналог array_splice в python
1
talatala
привет, никак не могу найти где описывается аналог PHP ф-ции array_splice (именно splice, а не слайс). Подскажите, как это можно сделать минимальным количеством телодвижений (в идеале, как PHP - всего одной функцией)

так же, интересует, как сделать слайс массива, но не используя питон нотацию . а по-человечески - через функцию или метод

спасибо!
knkd
1)
 del array[x:y:z]
2.1) А зачем? О_о
2.2)
from functools import getslice

getslice(array, x, y)
2.3)
array.__getslice__(x,y)
asv13
Такую функцию и самому можно написать, спрятав нотации внутри, но зачем???

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')
talatala
ясно, спасибо. Просто хотелось найти встроенную, так как по идее должно быстрее работать.
В случае способов типа a = a и т.д. будет создана копия всего массива (списка, последовательноси в общем), как я понимаю, и уже от её начала будут взяты элементы. Если это не так, то нотация устраивает в принципе всем, так как более идеологически правильнее, в питом это делать именно таким оператором slice, только насколько это оптимально по сравнению с кажем, если бы существовала встроенная ф-ция а-ля array_splice ?
knkd
talatala
только насколько это оптимально по сравнению с кажем, если бы существовала встроенная ф-ция а-ля array_splice ?
Это и есть вызов метода __getitem__(self, key) которому передаётся число находящееся в квадратных скобках или объект класса Slise.
Какую бы функцию вы не использовали, она всё равно будет вызывать __getitem__(self, key).
Александр Кошелев
talatala
Просто хотелось найти встроенную, так как по идее должно быстрее работать.
Нет, не должно.
talatala
В случае способов типа a = a и т.д. будет создана копия всего массива (списка, последовательноси в общем), как я понимаю, и уже от её начала будут взяты элементы.
Нет, это не так.
talatala
ок, спасибо, тогда, что бы полностью разобраться чуть изменю вопрос: подскажите наиболее быструю конструкцию, которая будет брать заданное кол-во элементов с начала списка (в принципе любой последовательности и collection) с их удалением из этого списка, без неявных копирований. То есть не сильно расходующая память и процессор.

a = a

всё-равно будет копировать срез списка a в объект a создавая его заново при каждом присваивании ?

в идеале хочу чего-то вроди:

a = [1, 2, 3, 4, 5, 6, 7, 8]
while len(my_slice = array_shift(a, 2)) :
pass
где array_shift - это псевдокод, осуществляющий сабжевый функционал
asv13
Было бы неплохо полнее раскрыть задачу. Это какой то “moving average” или еще что-то? Возможно лучше использовать итератор или же нет. Зачем создавать my_slice (а не брать данные из списка ) в вашем примере в каждой итерации, и что с ним будет дальше.
o7412369815963
> То есть не сильно расходующая память и процессор.
> a = a
Оно и есть - будет работать быстро, а часть памяти высвободиться.

И вообще вы не с того конца начали, за оптимизацию надо браться в конце, и то если будет тормозить.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB