Как объявить массив в Python?
Я не могу найти ссылки на массивы в документации.
Как объявить массив в Python?
Я не могу найти ссылки на массивы в документации.
variable = []
Теперь variable
ссылается на пустой список *.
Конечно, это назначение, а не декларация. В Python нет возможности сказать, что "эта переменная никогда не должна ссылаться ни на что иное, кроме списка", поскольку Python динамически типизируется.
* По умолчанию встроенный тип Python называется списком, а не массивом. Это упорядоченный контейнер произвольной длины, который может содержать гетерогенную коллекцию объектов (их типы не имеют значения и могут свободно смешиваться). Это не следует путать с модулем array
, который предлагает тип ближе к типу C array
; содержимое должно быть однородным (все одинакового типа), но длина остается динамической.
Фактически вы не объявляете вещи, но именно так вы создаете массив в Python:
from array import array
intarray = array('i')
Для получения дополнительной информации см. модуль массива: http://docs.python.org/library/array.html
Теперь вам не нужен массив, но список, но другие уже ответили на это.:)
Я думаю, что вы (означало) хотите список с первыми 30 ячейками, которые уже заполнены. Так
f = []
for i in range(30):
f.append(0)
Пример того, где это можно использовать, - это последовательность Фибоначчи. См. Проблему 2 в Project Euler
Это удивительно сложная тема в Python.
Массивы представлены классом list
(см. ссылка и не смешивайте их с generators).
Ознакомьтесь с примерами использования:
# 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
операция стоит дорогоПроверьте удивительную сложность таблицы операций.
Кроме того, см. это изображение, где я попытался показать наиболее важные различия между массивом, массивом ссылок и связанным списком:
Вот как это сделать:
my_array = [1, 'rebecca', 'allard', 15]
Вы не заявляете ничего в Python. Вы просто используете его. Я рекомендую вам начать с чего-то вроде http://diveintopython.net.
для расчетов используйте 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
эти массивы numpy могут быть сохранены и загружены с диска (даже сжатые), а сложные вычисления с большим количеством элементов C-подобны быстро. Многое используется в научной среде. См. здесь для более...
Обычно я просто a = [1,2,3]
, который на самом деле является list
, но для arrays
рассмотрит это формальное определение
Несколько предложений показали, что массивы в python представлены списками. Возможно, теоретически/под капотом, который является правильным, однако главное различие между ними состоит в том, что списки принимают смешанные типы данных и смешанные числовые типы, с другой стороны, для массива требуется тип-код, ограничивающий все элементы определенным типом:
list_01 = [4, 6.2, 7-2j, 'flo', 'cro']
list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']
Это невозможно с помощью array().
Чтобы добавить к ответу Lennart, массив может быть создан следующим образом:
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(), extend() и 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: list должны были быть целыми, а не float, поскольку массивы можно перебирать, подобно np.array и спискам:
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
Вслед за Леннартом также numpy, который реализует однородные многомерные массивы.
Как насчет этого...
>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6
Python называет их lists. Вы можете написать литерал списка с квадратными скобками и запятыми:
>>> [6,28,496,8128]
[6, 28, 496, 8128]
У меня был массив строк, и мне понадобился массив с одинаковой длиной булевых объектов, инициализированный True. Это то, что я сделал
strs = ["Hi","Bye"]
bools = [ True for s in strs ]
комментарий JohnMachin должен быть реальным ответом. Все остальные ответы - это всего лишь обходные пути, на мой взгляд! Итак:
array=[0]*element_count
Вы можете создавать списки и преобразовывать их в массивы или создавать массив с помощью 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, используя функцию reshape, которая принимает входные данные в качестве размеров матрицы.
mat = a.reshape(2, 2)