Python.v.JavaScript

JavaScript for Pythonistas. Python for JavaScripters

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

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

Python Javascript
Создание списка / массива #
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;
[ '4' ]
var my_array = new Array("Hello!");
my_array;
[ 'Hello!' ]

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

Доступ по индексу #
my_list = [3, 2, 10, "Hello"]
my_list[0]
3
my_list[1]
2
my_list[-1]
'Hello'
var my_array = [3, 2, 10, "Hello"];
my_array[0];
3
my_array[1];
2
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"];
2

В 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)
4
var my_array = [3, 2, 10, "Hello"];
my_array.length;
4
Добавление элемента в список / массив #
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 ]
ссылка требует: es6
Конкатенация #
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]
15
len(my_list)
2
var my_array = [2, 10, 15];
delete my_array[1];
my_array;
[ 2, , 15 ]
my_array[1];
undefined
my_array.length;
3
Очистить список / массив #
my_list = [1, 2, 10]
my_list.clear()
my_list
[]
var my_array = [1, 2, 10]
my_array.length = 0
my_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] = 100
my_array;
[ 1, 2, 10, , , 100 ]
my_array[3];
undefined
my_array[5];
100
Оператор in #
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