Чем отличается массив от списка python
Перейти к содержимому

Чем отличается массив от списка python

  • автор:

разница list и array

Нет, в некоторых местах эти слова используют взаимозаменяемо. «Истинного» списка не существует как понятия в принципе, но tuple неизменяем, поэтому в кандидаты не годится. Вряд ли вам кто-то даст ответ на этот вопрос, поэтому проще создать миллион элементов и посмотреть расход памяти, это не так сложно; я не думаю, что для вас это должно иметь разницу, пока вы реально не уперлись в память.

9 дек 2015 в 9:26

да, соглашусть, что многие языки путают эти понятия. Но все же, array — это обычно один непрерывный кусок памяти, а list — это часто связанный список. Исходя из этого, array обычно потребляет меньше памяти, так как списку нужно хранить указатель на следующий элемент.

9 дек 2015 в 9:37

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Строго говоря, связный список и массив — это различные структуры данных, которые не привязаны к конкретному языку программирования.

Массив

Массив — это совокупность однотипных данных, расположенных непрерывно в памяти. Доступ к элементу осуществляется по индексу за O(1) — мы обращаемся непосредственно к нужному участку памяти.

Связанный список

Доступ к элементу в связном списке в среднем занимает O(N) путем перебора элементов в поисках нужного. Способы доступа к элементам отличаются по реализации и от языка программирования. Например, на Java в стандартном классе LinkedList в зависимости от ситуации проход элементов может начинаться как с начала, так и с конца списка. И поиск элемента может осуществляться как по индексу, так и по сравнению элементов.

Связный список требует больших расходов памяти при прочих равных условиях за счет хранения указателей на следующий/предыдущий элементы и особенностей внутренней реализации.

Что касается Python: согласно документации:

Internally, a list is represented as an array; the largest costs come from growing beyond the current allocation size (because everything must move), or from inserting or deleting somewhere near the beginning (because everything after that must move).

Как видим, внутренне list представляет собой массив, для tuple — аналогично.

Python.v.JavaScript

JavaScript for Pythonistas. Python for JavaScripters

Списки / массивы

Стандартная структура данных для хранения нескольких элементов в определённом порядке в Python называется списком ( list ), в JavaScript называется массивом ( Array ).

my_list = [3, 2, 10, "Hello"] my_list
[3, 2, 10, 'Hello']
var my_array = [3, 2, 10, "Hello"];my_array;
[ 3, 2, 10, 'Hello' ]
my_list = list('Hello!') my_list
['H', 'e', 'l', 'l', 'o', '!']
var my_array = Array(1, 2, 3, "Hello");my_array;
[ 1, 2, 3, 'Hello' ]
var my_array = new Array(1, 2, 3, "Hello");my_array;
[ 1, 2, 3, 'Hello' ]
var my_array = new Array(4);my_array;
var my_array = new Array("4");my_array;
var my_array = new Array("Hello!");my_array;
[ 'Hello!' ]

В JavaScript массивы можно создавать, используя функцию Array (со словом new или без него: эффект одинаковый). Если эта функция получает в качестве аргумента одно целое число, то это число принимается за длину массива, который нужно создать, при этом создаётся массив с пустыми слотами. В иных случаях (несколько аргументов, аргумент-строка) создается массив, элементами которого являются перечисленные аргументы. Из-за непоследовательного поведения этой функции и получающихся массивов с пустыми слотами этот метод является не рекомендуемым, подробнее см. в YDKJS.

my_list = [3, 2, 10, "Hello"] my_list[0]
my_list[1]
my_list[-1]
'Hello'
var my_array = [3, 2, 10, "Hello"];my_array[0];
my_array[1];
my_array[my_array.length-1];
Hello
my_list = [2, 3, 10] my_list["0"] 
Exception: TypeError list indices must be integers or slices, not str
var my_array = [2, 3, 10];my_array["0"];

В JavaScript массивы являются частным случаем объектов, а объекты индексируются строками. Числовые индексы неявно преобразуются в строки.

my_list = [3, 2, 10, "Hello"] my_list[0] = 100 my_list
[100, 2, 10, 'Hello']
var my_array = [3, 2, 10, "Hello"]; my_array[0] = 100;my_array;
[ 100, 2, 10, 'Hello' ]
my_list = [3, 2, 10, "Hello"] len(my_list)
var my_array = [3, 2, 10, "Hello"];my_array.length;
my_list = [3, 2, 10, "Hello"] my_list.append(5) my_list
[3, 2, 10, 'Hello', 5]
var my_array = [3, 2, 10, "Hello"]; my_array.push(5);my_array;
[ 3, 2, 10, 'Hello', 5 ]
my_list = [3, 2] my_list.extend([12, 20]) my_list
[3, 2, 12, 20]
var my_array = [3, 2]; my_array.push(12, 20);my_array;
[ 3, 2, 12, 20 ]
my_list = [3, 2, 10, "Hello"] other_list = [1, 2, 3] my_list.extend(other_list) my_list
[3, 2, 10, 'Hello', 1, 2, 3]
var my_array = [3, 2, 10, "Hello"]; var other_array = [1, 2, 3]; my_array.push.apply(my_array, other_array);my_array;
[ 3, 2, 10, 'Hello', 1, 2, 3 ]
var my_array = [3, 2, 10, "Hello"]; var other = [1, 2, 3]; Array.prototype.push.apply(my_array, other);my_array;
[ 3, 2, 10, 'Hello', 1, 2, 3 ]
function extend(arr, other) < /* you should include a test to * check whether other_array really * is an array */ other.forEach(function(v) < arr.push(v); >); > var my_array = [3, 2, 10, "Hello"]; var other_array = [1, 2, 3]; extend(my_array, other_array);my_array;
[ 3, 2, 10, 'Hello', 1, 2, 3 ]

Это наиболее эффективный способ расширения списка в случае, если второй список очень большой. В отличие от остальных методов, здесь не приходится передавать все элементы второго списка в качестве аргументов функции.

var my_array = [3, 2, 10, "Hello"]; var other_array = [1, 2, 3]; my_array.push(. other_array);my_array;
[ 3, 2, 10, 'Hello', 1, 2, 3 ]
first_list = [1, 2, 3] second_list = ["Hello", "World"] new_list = first_list + second_list new_list
[1, 2, 3, 'Hello', 'World']
first_array = [1, 2, 3]; second_array = ["Hello", "World"]; new_array = first_array.concat(second_array);new_array;
[ 1, 2, 3, 'Hello', 'World' ]
my_list = [2, 10, 15] del my_list[1] my_list
[2, 15]
my_list[1]
len(my_list)
var my_array = [2, 10, 15]; delete my_array[1];my_array;
[ 2, , 15 ]
my_array[1];
undefined
my_array.length;
my_list = [1, 2, 10] my_list.clear() my_list
var my_array = [1, 2, 10] my_array.length = 0my_array;
my_list = [1, 20, 10] my_list[3] 
Exception: IndexError list index out of range
var my_array = [1, 20, 10]my_array[3];
undefined
my_list = [1, 2, 10] my_list[5] = 100 
Exception: IndexError list assignment index out of range
var my_array = [1, 2, 10] my_array[5] = 100my_array;
[ 1, 2, 10, , 100 ]
my_array[3];
undefined
my_array[5];
my_list = [1, 7, 10] 1 in my_list
True
7 in my_list
True
10 in my_list
True
2 in my_list
False
"1" in my_list
False

Оператор in для списков проверяет, находится ли элемент в списке.

list_like_dict = < 0: 1, 1: 7, 2: 10 >1 in list_like_dict
True
7 in list_like_dict
False
10 in list_like_dict
False
2 in list_like_dict
True
"1" in list_like_dict
False

Если сделать словарь, похожий на список (с числовыми ключами), то оператор in будет проверять, находится ли данный элемент среди индексов (как это всегда происходит со словарями). Примерно так работает аналогичный оператор в JavaScript.

var my_array = [1, 7, 10];1 in my_array;
true
7 in my_array;
false
10 in my_array;
false
2 in my_array;
true
"1" in my_array;
true

Поскольку массив в JavaScript — это частный случай объекта (то есть штуки, похожей на словарь), in проверяет, есть ли данный элемент среди индексов (ключей), а не среди значений. См. этот ответ по поводу проверки на наличие элемента среди значений.

my_list = [0, 10, 20, 30, 40, 50, 60] my_list[2:4]
[20, 30]
my_list[:2]
[0, 10]
my_list[2:]
[20, 30, 40, 50, 60]
my_list[2:-2]
[20, 30, 40]
my_list[:]
[0, 10, 20, 30, 40, 50, 60]
my_list[2:6:2]
[20, 40]
my_list[4:2:-1]
[40, 30]
my_array = [0, 10, 20, 30, 40, 50, 60]my_array.slice(2, 4);
[ 20, 30 ]
my_array.slice(null, 2);
[ 0, 10 ]
my_array.slice(2);
[ 20, 30, 40, 50, 60 ]
my_array.slice(2, -2);
[ 20, 30, 40 ]
my_array.slice();
[ 0, 10, 20, 30, 40, 50, 60 ]

Срезов с шагом (третий аргумент в Python) в JavaScript по умолчанию нет.

my_list = [0, 10, 20, 30, 40] my_list[2:4] = [200, 300, 400] my_list
[0, 10, 200, 300, 400, 40]
my_list[1:2] = [] my_list
[0, 200, 300, 400, 40]
my_list[3:3] = [999] my_list
[0, 200, 300, 999, 400, 40]
var my_array = [0, 10, 20, 30, 40]; var deleted; deleted = my_array.splice(2, 2, 200, 300, 400);my_array;
[ 0, 10, 200, 300, 400, 40 ]
deleted;
[ 20, 30 ]
my_array.splice(1, 1);my_array;
[ 0, 200, 300, 400, 40 ]
my_array.splice(3, 0, 999);my_array;
[ 0, 200, 300, 999, 400, 40 ]

Метод splice(start, deleteCount, item1, item2, . ) редактирует массив in place: удаляет deleteCount элементов, начиная с start , затем добавляет элементы item1 , item2 , и т.д.

© Ilya V. Schurov and contributors, 2017
Licenses: CC BY (text), MIT (code).
contribute on github

Язык

  • Английский (English)
  • Русский (Russian)

Темы

  • Списки / массивы
  • Цикл for
  • Словари / объекты
  • Области видимости
  • Типы и сравнение
  • Функции

Массивы и списки в Python

Рассмотрим в уроке массивы и их виды, списки, нумерацию списков и основные методы при работе с ними.

Массивы

Мы уже рассматривали строковой тип данных. Он представляется как массив символов и обозначается как array. Массивы могут быть одномерными и многомерны.

Массивы символов

Перед началом работы с массивами подключаем соответствующий модуль. Для этого введем команду:

from array import *

Создадим массив для данных типа int:

>>> a = array('i', [2, 5, 4, 0, 8]) >>> type(a) >>> a array('i', [2, 5, 4, 0, 8])

Теперь обратимся к каждому из элементов данного массива. Попробуем изменить их и дополнить массив:

>>> a[2] 4 >>> a[6] Traceback (most recent call last): File "", line 1, in a[6] IndexError: array index out of range

Как видите, нельзя обратиться к элементу, которого нет.

Любой массив может содержать данные только одного типа, то есть нельзя использовать int и float в одном массиве. Это является недостатком при работе, для устранения которого были введены списки (list).

Список в Python

Список в Python похож на массив. Различие в том, что в списках можно хранить объекты различных типов данных. Размер списка не статичен и поддается изменениям.

На программном уровне переменная, определяемая как список, содержит ссылку на структуру в памяти, которая хранит ссылки на какие-либо другие объекты или структуры.

Списки в Python

Рассмотрим на примере:

>>> a = [] >>> type(a)

Теперь добавим элементы и проверим доступ к ним:

>>> a = [1,0.34,"Hello"] >>> a [1, 0.34, 'Hello'] >>> a[2] 'Hello' >>> a[0] 1 >>> a[1] 0.34

Нумерация списка в Python

Прямая и обратная нумерация

По умолчанию нумерация начинается с 0.

a = [1, 'abc', h, 0,256] 0 1 2 3 

При обратной нумерации элементы считаются с конца и начинаются с -1:

a = [1, 'abc', h, 0,256] -4 -3 -2 -1

С помощью этих индексов можем обратиться к каждому элементу списка:

a[0] >>> 1 a[-2] >>> h

Срез

Срез — это некий диапазон символов, к которому мы обращаемся. При срезе вторым числом мы указываем номер символа, который не входит в диапазон:

a[0:2] #[1, 'abc'] a[-4:-2] #[1, 'abc']

Мы можем обратиться и к символам с использованием разных нумераций одновременно:

a[0:-2] #[1, 'abc']

Если мы не укажем одну из границ среза, то программа принимает за границу первый или последний символ:

a[:2] #[1, 'abc'] a[2:] #[h, 0,256]

Методы работы со списками

Рассмотрим основные методы работы со списками на примерах.

list.append(x)

Добавляет в конце списка новый элемент x:

>>> a = [0,0.1,"один"] >>> a.append(321) >>> a [0, 0.1, 'один', 321]
list.insert(i,x)

Вставка элемента x на место i (нумерация начинается с нуля):

>>> a = [0,0.1,"один"] >>> a.insert(1,321) >>> a [0, 321, 0.1, 'один']
list.extend(L)

Добавляет в конец списка список L:

>>> a = [0,0.1,"один"] >>> b = ["два",3,4.1] >>> a.extend(b) >>> a [0, 0.1, 'один', 'два', 3, 4.1]
list.remove(x)

Удаляет первый встреченный элемент со значением x:

>>> a = [0,0.1,"один",0] >>> a.remove(0) >>> a [0.1, 'один', 0]
list.pop(i)

Возвращает элемент, размещенный по индексу i, удаляет его из списка:

>>> a = [0,0.1,"один",0] >>> a.pop(3) 0 >>> a [0, 0.1, 'один']
list.count(x)

Возвращает количество элементов, равных x:

>>> a = [0,0.1,"один",0] >>> a.count(0) 2
list.clear()
>>> a = [0,0.1,"один",0] >>> a [0, 0.1, 'один', 0] >>> a.clear() >>> a []

Курсы Робикс, в которых изучается этот материал.

  1. Программирование на Python в Minecraft
  2. Duckietown робот с системой Автопилота

Отличия понятий «список» и «массив»?

конкретизируй задачу, или ты потеоритизировать в вечер пятничной-среды пришел?

(можно миллион примеров когда список будет массивом и наоборот в обоих языках привести(двумерный массив для начала как пример), с ошибками из этого)

missxu
( 31.10.18 19:24:27 MSK )

madcore ★★★★★
( 31.10.18 19:59:01 MSK )

А еще в JS это некоторые называют объектом. У JS с терминологией проблемы.

Я как-то привык оперировать понятиями из С-подобных языков. Где массив — это

int array[10]; 

а список это, если я правильно помню плюсы, как-то так

struct List < int val; List * next; >; a = new List; 

А интерпретации в питоне и в JS — по мне так все это массивы. К ним можно, в общем случае, обращаться и как стильно-модно-моложежно array.item, так и по класике массивов array[‘item’].

l0stparadise ★★★★★
( 31.10.18 20:04:35 MSK )
Ответ на: комментарий от l0stparadise 31.10.18 20:04:35 MSK

а список это, если я правильно помню

Это односвязный список.

RazrFalcon ★★★★★
( 31.10.18 20:12:00 MSK )
Ответ на: комментарий от l0stparadise 31.10.18 20:04:35 MSK
anonymous
( 31.10.18 20:13:11 MSK )

Оооой, дэтышкии.. во веремена моей молодусти онож как було.. аррэй это когда в памяти кусок, а линкед лист это когда прых-прых по памяти. Окей?

Deleted
( 31.10.18 20:16:35 MSK )

Это зависит от принятой в языке терминологии. Часто под списком понимают односвязный список с O(n) random access, а под массивом — структуру, элементы которой расположены в памяти последовательно с O(1) random access.

theNamelessOne ★★★★★
( 01.11.18 14:04:23 MSK )

В скриптопараше поди и то и это вообще через хешмапы реализовано.

vazgen05 ★★★
( 01.11.18 14:13:15 MSK )

по сути получается, что арэи типизирован, а список хранит всё что в него сунешь

anonymous
( 01.11.18 14:52:40 MSK )
Ответ на: комментарий от anonymous 01.11.18 14:52:40 MSK

по сути получается, что арэи типизирован, а список хранит всё что в него сунешь

Да, только арэи не в самом питоне, а сбоку.

madcore ★★★★★
( 01.11.18 14:54:51 MSK )
Ответ на: комментарий от madcore 01.11.18 14:54:51 MSK

ну так ничего доставлять не нужно, в builtin нет, но простого импорта достаточно

anonymous
( 01.11.18 15:03:09 MSK )
Ответ на: комментарий от l0stparadise 31.10.18 20:04:35 MSK

А еще в JS это некоторые называют объектом

Так там всё на ассоциативных массивах и они могут обладать поведением, т.е. вполне себе объекты.

WitcherGeralt ★★
( 01.11.18 16:13:18 MSK )

Понятие массив шире, а список — его подмножество. Если конкретно в питоне и жопоскрипте, то да, list примерно равен Array.

WitcherGeralt ★★
( 01.11.18 16:22:59 MSK )
Последнее исправление: WitcherGeralt 01.11.18 16:24:43 MSK (всего исправлений: 1)

Ответ на: комментарий от WitcherGeralt 01.11.18 16:22:59 MSK

Понятие массив шире, а список — его подмножество.

Но ведь это вопрос терминологии в контектсте конкретного языка.

docpro
( 02.11.18 12:03:54 MSK )
Ответ на: комментарий от docpro 02.11.18 12:03:54 MSK

Поэтому я и отправил товарища читать вики.

WitcherGeralt ★★
( 02.11.18 12:25:54 MSK )
Ответ на: комментарий от WitcherGeralt 01.11.18 16:13:18 MSK
anonymous
( 02.11.18 13:02:37 MSK )
Ответ на: комментарий от anonymous 02.11.18 13:02:37 MSK

Если пикча призвана опровергнуть сказанное мной, то ты, видимо, меня не понял.

WitcherGeralt ★★
( 02.11.18 13:13:03 MSK )

в общем случае, массив хранит порядок элементов, список хранит только состав как множество и может вернуть в любом другом порядке

anonymous
( 03.11.18 18:30:47 MSK )
Ответ на: комментарий от WitcherGeralt 01.11.18 16:22:59 MSK

Понятие массив шире, а список — его подмножество

Нет. В массиве нельзя вставить элемент без перезаписи хвоста массива.

monk ★★★★★
( 03.11.18 23:06:44 MSK )
Ответ на: комментарий от anonymous 03.11.18 18:30:47 MSK

список хранит только состав как множество и может вернуть в любом другом порядке

Откуда такие странные сведения? Список всегда упорядочен.

monk ★★★★★
( 03.11.18 23:07:27 MSK )
Ответ на: комментарий от monk 03.11.18 23:06:44 MSK

Омг, где, когда, какая вставка? Массив это общее понятие для структурированного набора данных, они разные бывают. Хз про какой именно ты язык, но я говорю о понятии вне рамок конкретного языка.

WitcherGeralt ★★
( 03.11.18 23:47:26 MSK )
Последнее исправление: WitcherGeralt 03.11.18 23:48:14 MSK (всего исправлений: 1)

Ответ на: комментарий от WitcherGeralt 03.11.18 23:47:26 MSK

Массив это общее понятие для структурированного набора данных, они разные бывают. Хз про какой именно ты язык, но я говорю о понятии вне рамок конкретного языка.

Особенностью массива как структуры данных (в отличие, например, от связного списка) является константная вычислительная сложность доступа к элементу массива по индексу. Массив относится к структурам данных с произвольным доступом.

Под массив выделяется непрерывный блок памяти

Для списка оба этих утверждения ложны. Поэтому список никак не может являться частным случаем массива.

monk ★★★★★
( 04.11.18 07:58:04 MSK )
Последнее исправление: monk 04.11.18 07:58:15 MSK (всего исправлений: 1)

Ответ на: комментарий от monk 04.11.18 07:58:04 MSK

В статье рассматривается именно array, т.е. индексный массив (там даже перенаправление такое есть), но упоминается и разреженный массив и ассоциативный.

Таким образом в русском языке массив это больше чем просто array. Очень часто встречал использование слова «массив» в качестве обобщающего термина для структурированных наборов данных, сам так его использую и не вижу смысла исключать из этого множества список.

WitcherGeralt ★★
( 04.11.18 13:12:37 MSK )

У слова «список» нет однозначной трактовки. Массив это последовательная область в памяти, в которой лежат элементы одинакового размера.

Legioner ★★★★★
( 04.11.18 13:37:10 MSK )
Ответ на: комментарий от anonymous 03.11.18 18:30:47 MSK

в общем случае, массив хранит порядок элементов, список хранит только состав как множество и может вернуть в любом другом порядке

в общем случае это утверждение чцшь, так как этот анонимус путает список (list) и множество (set).

Вообще, в этой теме наболтали чепухи. Лучше читать документацию по интересующему языку программирования.

Если конкретно, то массивы в JavaScript являются списками, хоть и называются массивами в документации. При обращении к элементами по индексу их можно считать массивами, а при обращении другим способом — списками. То есть, толкование зависит от контекста. Обращение по индексу — массив, не по индексу — не массив.

var x = [];//объявляем массив, первоначально пустой

x.push (‘a’);//обращение как к списку — добавляем элемент

var y = x[0];//обращение как к массиву — получаем элемент по индексу

var z = x.shift();//обращение как списку, он становится пустым.

Итак, один и тот же объект можно считать массивом или списком в зависимости от использования. То же относится и к Python, но не ко всем языкам.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *