Уведомления

Группа в Telegram: @pythonsu

#1 Май 23, 2011 17:50:50

talatala
От:
Зарегистрирован: 2011-05-23
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

аналог array_splice в python

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

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

спасибо!



Офлайн

#2 Май 23, 2011 18:34:31

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

аналог array_splice в python

1)

 del array[x:y:z]
2.1) А зачем? О_о
2.2)
from functools import getslice

getslice(array, x, y)
2.3)
array.__getslice__(x,y)



Отредактировано (Май 23, 2011 18:37:51)

Офлайн

#3 Май 23, 2011 19:30:46

asv13
От:
Зарегистрирован: 2007-01-22
Сообщения: 130
Репутация: +  0  -
Профиль   Отправить e-mail  

аналог array_splice в python

Такую функцию и самому можно написать, спрятав нотации внутри, но зачем???

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



Офлайн

#4 Май 23, 2011 20:52:10

talatala
От:
Зарегистрирован: 2011-05-23
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

аналог array_splice в python

ясно, спасибо. Просто хотелось найти встроенную, так как по идее должно быстрее работать.
В случае способов типа a = a и т.д. будет создана копия всего массива (списка, последовательноси в общем), как я понимаю, и уже от её начала будут взяты элементы. Если это не так, то нотация устраивает в принципе всем, так как более идеологически правильнее, в питом это делать именно таким оператором slice, только насколько это оптимально по сравнению с кажем, если бы существовала встроенная ф-ция а-ля array_splice ?



Офлайн

#5 Май 23, 2011 21:34:10

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

аналог array_splice в python

talatala
только насколько это оптимально по сравнению с кажем, если бы существовала встроенная ф-ция а-ля array_splice ?
Это и есть вызов метода __getitem__(self, key) которому передаётся число находящееся в квадратных скобках или объект класса Slise.
Какую бы функцию вы не использовали, она всё равно будет вызывать __getitem__(self, key).



Офлайн

#6 Май 23, 2011 22:03:18

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

аналог array_splice в python

talatala
Просто хотелось найти встроенную, так как по идее должно быстрее работать.
Нет, не должно.
talatala
В случае способов типа a = a и т.д. будет создана копия всего массива (списка, последовательноси в общем), как я понимаю, и уже от её начала будут взяты элементы.
Нет, это не так.



Офлайн

#7 Май 23, 2011 22:54:17

talatala
От:
Зарегистрирован: 2011-05-23
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

аналог array_splice в python

ок, спасибо, тогда, что бы полностью разобраться чуть изменю вопрос: подскажите наиболее быструю конструкцию, которая будет брать заданное кол-во элементов с начала списка (в принципе любой последовательности и 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 - это псевдокод, осуществляющий сабжевый функционал



Офлайн

#8 Май 24, 2011 10:50:35

asv13
От:
Зарегистрирован: 2007-01-22
Сообщения: 130
Репутация: +  0  -
Профиль   Отправить e-mail  

аналог array_splice в python

Было бы неплохо полнее раскрыть задачу. Это какой то “moving average” или еще что-то? Возможно лучше использовать итератор или же нет. Зачем создавать my_slice (а не брать данные из списка ) в вашем примере в каждой итерации, и что с ним будет дальше.



Офлайн

#9 Май 25, 2011 04:44:55

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

аналог array_splice в python

> То есть не сильно расходующая память и процессор.
> a = a
Оно и есть - будет работать быстро, а часть памяти высвободиться.

И вообще вы не с того конца начали, за оптимизацию надо браться в конце, и то если будет тормозить.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version