Как объявить массив в Python?

491

Как мне объявить массив в Python ?

Я не могу найти ссылки на массивы в документации.

Питер Мортенсен
источник
121
По непонятной причине Python называет массивы списками. Школа языкового дизайна «все знают, что это называется», «мы будем называть это что-то еще». Это особенно плохой выбор имени, так как он выглядит как связанный список, а не как массив.
Гленн Мейнард
42
@Glenn Maynard: вероятно, потому что в C-подобных языках массивы имеют фиксированную длину, а списки Python - нет. Это больше похоже на вектор STL в C ++ или ArrayList в Java.
MAK
128
Это называется списком, потому что это список. [A (), 1, 'Foo', u'öäöäö ', 67L, 5.6]. Список. Массив - это «расположение элементов по одинаково разнесенным адресам в памяти компьютера» (википедия).
Леннарт Регебро
35
Ничто в универсально понятном термине «массив» не предполагает фиксированную длину или что-либо в отношении контента; это всего лишь ограничения конкретной реализации массивов в Си. Списки Python расположены одинаково (указатели на объекты внутри), иначе __getitem__не будет O (1).
Гленн Мейнард
24
@Glenn, из en.wikipedia.org/wiki/Array_data_structure: «элементы структуры данных массива должны иметь одинаковый размер» (верно для массивов Python, не верно для списков Python) и «набор допустимых кортежей индексов и адреса элементов (и, следовательно, формула адресации элементов) обычно являются фиксированными во время использования массива "(неверно в Python для списка или массива).
Алекс Мартелли

Ответы:

358
variable = []

Теперь variableотносится к пустому списку * .

Конечно, это задание, а не декларация. В Python нет никакого способа сказать «эта переменная никогда не должна ссылаться ни на что, кроме списка», поскольку Python динамически типизирован.


* Встроенный тип Python по умолчанию называется списком , а не массивом. Это упорядоченный контейнер произвольной длины, который может содержать гетерогенную коллекцию объектов (их типы не имеют значения и могут свободно смешиваться). Это не следует путать с arrayмодулем , который предлагает тип ближе к arrayтипу C ; содержимое должно быть однородным (все одного типа), но длина по-прежнему динамична.

sepp2k
источник
11
Можно ли инициализировать содержимое массива, как в JavaScript? (например, как variable = ["Hi", "Hello"];?)
Андерсон Грин
6
@AndersonGreen Да.
sepp2k
3
Как бы вы объявили многомерный массив (например, двумерный массив?)
Андерсон Грин,
7
@AndersonGreen Как я уже сказал, в Python нет такого понятия, как объявление переменной. Вы бы создать многомерный список, взяв пустой список и ввод других списков внутри или, если размеры списка известны в записи время, вы могли бы просто написать его в качестве литерала , как это: my_2x2_list = [[a, b], [c, d]]. В зависимости от того, для чего вам нужны многомерные массивы, вы также можете подумать об использовании numpy, которое определяет типы массивов для многомерных однородных распакованных массивов, которые могут быть гораздо более эффективными, когда это применимо, поэтому они предпочтительнее для численных вычислений.
13
1
@IfanIqbal Да, если он содержит хотя бы один элемент, вы можете.
sepp2k
136

Это удивительно сложная тема в Python.

Практический ответ

Массивы представлены классом list(см. Ссылку и не смешивайте их с генераторами ).

Посмотрите примеры использования:

# empty array
arr = [] 

# init with values (can contain mixed types)
arr = [1, "eels"]

# get item by index (can be negative to access end of array)
arr = [1, 2, 3, 4, 5, 6]
arr[0]  # 1
arr[-1] # 6

# get length
length = len(arr)

# supports append and insert
arr.append(8)
arr.insert(6, 7)

Теоретический ответ

Под капотом Python listнаходится обертка для реального массива, который содержит ссылки на элементы. Кроме того, базовый массив создается с дополнительным пространством.

Последствия этого:

  • произвольный доступ действительно дешево (то arr[6653]же самое arr[0])
  • append операция «бесплатно», в то время как дополнительное пространство
  • insert операция дорогая

Проверьте эту удивительную таблицу сложности операций .

Также, пожалуйста, посмотрите на эту картинку, где я попытался показать наиболее важные различия между массивом, массивом ссылок и связанным списком: массивы, массивы везде

Антон Пурин
источник
5
Просто добавлю, есть действительно крутой способ вырезать массивы в python: [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]результат будет[2, 3, 4, 5, 6, 7]
Антон Пурин
2
Я вижу некоторые отрицательные голоса за этот пост время от времени. Было бы здорово, если бы кто-то мог написать слово почему. Спасибо.
Антон Пурин
2
Вы настоящий MVP. Необходимо знать фактический выбранный дизайн «списка», чтобы принимать разумные программные решения. По сути, это как «вектор» в C ++. Спасибо!
Некро
Это очень длинный ответ с большим объяснением!
Ахмед
Могу ли я добавить практические обозначения для сравнения, например: a == b[:2]возвращает True, если первые 2 элемента b равны значениям массива a
Бруно Л.
124

Вы на самом деле не объявляете вещи, но вот как вы создаете массив в Python:

from array import array
intarray = array('i')

Для получения дополнительной информации см. Модуль массива: http://docs.python.org/library/array.html.

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

Леннарт Регебро
источник
10
Это довольно забавно, но не очень хороший ответ на вопрос с меткой «новичок». Просто чтобы прояснить: в Python вы обычно используете тип данных с именем a list. Python имеет специальный тип данных, называемый an, arrayкоторый больше похож на массив C и мало используется.
Steveha
63
Нет, но все остальные уже использовали список. Я подумал, что будет хорошим ответом отметить, что есть и массивы.
Леннарт Регебро
8
супер безумный реквизит для этого ответа. Я программировал на Python в течение многих лет и только недавно понял, что существует реальный объект массива Python, который отличается от объектов списка. Хотя структура данных очень похожа, массивы ограничивают тип объектов, которые может содержать массив. Отличный ответ @LennartRegebro!
Джош Браун
4
Это должен быть правильный ответ. List и Arrays - это две разные вещи. @LennartRegebro спасибо
Мина Габриэль,
Есть конкретная причина, по которой вы можете использовать массивы вместо списков. В частности, если у вас есть массив с именем myarray, полный чисел, вы можете выполнять с ним математические операции, и эти операции применяются ко всем элементам внутри него. Итак, если вы выполните myarray / 3, каждое число внутри будет разделено на 3. Если вы попытаетесь сделать то же самое со списком, вы получите ошибку. Таким образом, массивы более эффективны для больших наборов данных чисел.
Мэтью
66

Я думаю, что вы (имели в виду) хотите список с уже заполненными первыми 30 ячейками. Так

   f = []

   for i in range(30):
       f.append(0)

Примером того, где это можно использовать, является последовательность Фибоначчи. Смотрите проблему 2 в Project Euler

limitcracker
источник
96
Это довольно барочный способ инициализации списка. Попробуй f = [0] * 30вместо этого.
Джон Мачин
Разве это не то же самое, что a = range (10) от @slehar anwer? Люблю питона, это синтаксис и это дзен.
m3nda
@ erm3nda nope: $ python3 Python 3.4.2 [...] >>> a = range (10) >>> print (a) range (0, 10) >>>
arp
37

Вот как:

my_array = [1, 'rebecca', 'allard', 15]
canadiancreed
источник
4
Поскольку это не массив Python, а список Python, не будет ли проще назвать его «my_list»?
Маттис Асп
4
Это создает список, а не массив. Они разные и имеют разные свойства в питоне. В частности, вы можете выполнять числовые операции с массивом, но не со списком.
Матфея
21

Для расчетов используйте массивы numpy :

import numpy as np

a = np.ones((3,2))        # a 2D array with 3 rows, 2 columns, filled with ones
b = np.array([1,2,3])     # a 1D array initialised using a list [1,2,3]
c = np.linspace(2,3,100)  # an array with 100 points beteen (and including) 2 and 3

print(a*1.5)  # all elements of a times 1.5
print(a.T+b)  # b added to the transpose of a

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

Многое используется в научной среде. Смотрите здесь для получения дополнительной информации.

Remi
источник
17

Комментарий Джона Мачина должен быть реальным ответом. Все остальные ответы - просто обходные пути, на мой взгляд! Так:

array=[0]*element_count
csabinho
источник
согласна. кроме осторожности, чтобы назвать даже переменную "массив", или получить пурист гнев. к этому я бы также добавил, что вы можете аналогичным образом создавать «многомерные массивы»:x=[[0] * 10] * 10
Peter S Magnusson
17

В нескольких предложениях предполагается, что массивы в python представлены списками. Это неверно Python имеет независимую реализацию array()в стандартном библиотечном модуле array " array.array()", поэтому неправильно путать их. Списки - это списки в Python, поэтому будьте осторожны с используемой номенклатурой.

list_01 = [4, 6.2, 7-2j, 'flo', 'cro']

list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']

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

Hussam
источник
16

Вы ничего не объявляете в Python. Вы просто используете это. Я рекомендую вам начать с чего-то вроде http://diveintopython.net .

Байера
источник
2
Иногда вы должны объявить тип переменной: если вы не используете ее раньше, структуру управления, она не существует вне структуры управления, и тогда вы будете создавать новую переменную. Тогда предполагается, что переменная представляет собой тип int, что конфликтует, если вы используете его как более сложный тип.
уточняю
@ Разумеется, использование функций иногда требует их объявления, а иногда для воспроизведения некоторых глобальных переменных при использовании функций, и мы не хотим писать слишком много аргументов для функций.
m3nda
Это не просто функция; простое утверждение if может дать вам ту же проблему.
Яснее
1
Программирование - все о декларировании, независимо от того, какой язык вы используете.
Объявление типа
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
Адриан Томпкинс
13

Я обычно просто делаю, a = [1,2,3]что на самом деле, listно для arraysвзгляда на это формальное определение

не секвитор
источник
11

Чтобы добавить к ответу Леннарта, массив может быть создан следующим образом:

from array import array
float_array = array("f",values)

где значения могут принимать форму кортежа, списка или np.array, но не массива:

values = [1,2,3]
values = (1,2,3)
values = np.array([1,2,3],'f')
# 'i' will work here too, but if array is 'i' then values have to be int
wrong_values = array('f',[1,2,3])
# TypeError: 'array.array' object is not callable

и результат будет все тот же:

print(float_array)
print(float_array[1])
print(isinstance(float_array[1],float))

# array('f', [1.0, 2.0, 3.0])
# 2.0
# True

Большинство методов для работы со списком также работают с массивом, распространенными из которых являются pop (), exte () и append ().

Судя по ответам и комментариям, кажется, что структура данных массива не так популярна. Хотя мне это нравится, так же, как можно предпочесть кортеж списку.

Структура массива имеет более строгие правила, чем список или np.array, и это может уменьшить количество ошибок и упростить отладку, особенно при работе с числовыми данными.

Попытки вставить / добавить float в массив int приведут к возникновению ошибки TypeError:

values = [1,2,3]
int_array = array("i",values)
int_array.append(float(1))
# or int_array.extend([float(1)])

# TypeError: integer argument expected, got float

Хранение значений, которые должны быть целыми числами (например, список индексов) в форме массива, может поэтому предотвратить «TypeError: индексы списка должны быть целыми числами, а не с плавающей точкой», так как массивы могут быть перебраны, подобно np.array и lists:

int_array = array('i',[1,2,3])
data = [11,22,33,44,55]
sample = []
for i in int_array:
    sample.append(data[i])

Досадно, что добавление int в массив float приведет к тому, что int станет float, не вызывая исключения.

np.array также сохраняет тот же тип данных для своих записей, но вместо сообщения об ошибке он изменит свой тип данных, чтобы соответствовать новым записям (обычно удваивается или str):

import numpy as np
numpy_int_array = np.array([1,2,3],'i')
for i in numpy_int_array:
    print(type(i))
    # <class 'numpy.int32'>
numpy_int_array_2 = np.append(numpy_int_array,int(1))
# still <class 'numpy.int32'>
numpy_float_array = np.append(numpy_int_array,float(1))
# <class 'numpy.float64'> for all values
numpy_str_array = np.append(numpy_int_array,"1")
# <class 'numpy.str_'> for all values
data = [11,22,33,44,55]
sample = []
for i in numpy_int_array_2:
    sample.append(data[i])
    # no problem here, but TypeError for the other two

Это верно и во время выполнения задания. Если указан тип данных, np.array, по возможности, преобразует записи в этот тип данных:

int_numpy_array = np.array([1,2,float(3)],'i')
# 3 becomes an int
int_numpy_array_2 = np.array([1,2,3.9],'i')
# 3.9 gets truncated to 3 (same as int(3.9))
invalid_array = np.array([1,2,"string"],'i')
# ValueError: invalid literal for int() with base 10: 'string'
# Same error as int('string')
str_numpy_array = np.array([1,2,3],'str')
print(str_numpy_array)
print([type(i) for i in str_numpy_array])
# ['1' '2' '3']
# <class 'numpy.str_'>

или, по сути:

data = [1.2,3.4,5.6]
list_1 = np.array(data,'i').tolist()
list_2 = [int(i) for i in data]
print(list_1 == list_2)
# True

в то время как массив просто даст:

invalid_array = array([1,2,3.9],'i')
# TypeError: integer argument expected, got float

Из-за этого не рекомендуется использовать np.array для команд, зависящих от типа. Структура массива здесь полезна. list сохраняет тип данных значений.

И для чего-то я нахожу довольно противным: тип данных указывается в качестве первого аргумента в array (), но (обычно) в качестве аргумента в np.array (). : |

Отношение к C упоминается здесь: список Python против массива - когда использовать?

Веселитесь, исследуя!

Примечание: типизированный и довольно строгий характер массива больше склоняется к C, а не к Python, и в своем дизайне Python не имеет многих специфичных для типа ограничений в своих функциях. Его непопулярность также создает положительную обратную связь в совместной работе, и замена его в основном включает дополнительный [int (x) для x в файле]. Поэтому вполне целесообразно и разумно игнорировать существование массива. Это не должно мешать большинству из нас. : D

Melvin
источник
8

Как насчет этого...

>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6
slehar
источник
6

Python называет их списками . Вы можете написать список литералов в квадратных скобках и запятых:

>>> [6,28,496,8128]
[6, 28, 496, 8128]
Полковник паника
источник
5

Вслед за Леннартом есть еще numpy, который реализует однородные многомерные массивы.

CAMH
источник
4

У меня был массив строк, и мне требовался массив логических значений той же длины, инициализированный как True. Это то что я сделал

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]
Педро А. Аранда
источник
Я здесь, потому что я хотел декларацию C: int count[26]={0}; возможно, есть лучший способ, но этот вариант boolsсверху сработал count=[0 for ii in range(26)]позже, затем я изменил его на тот, count=[0]*26который кажется предпочтительным.
user1683793
2

Вы можете создавать списки и конвертировать их в массивы или создавать массивы с помощью модуля numpy. Ниже приведено несколько примеров, иллюстрирующих то же самое. Numpy также облегчает работу с многомерными массивами.

import numpy as np
a = np.array([1, 2, 3, 4])

#For custom inputs
a = np.array([int(x) for x in input().split()])

Вы также можете преобразовать этот массив в матрицу 2X2, используя функцию изменения формы, которая принимает входные данные в качестве размеров матрицы.

mat = a.reshape(2, 2)
Амит Прафулла
источник