По непонятной причине 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 ; содержимое должно быть однородным (все одного типа), но длина по-прежнему динамична.
Можно ли инициализировать содержимое массива, как в 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 операция «бесплатно», в то время как дополнительное пространство
Просто добавлю, есть действительно крутой способ вырезать массивы в 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:
Это довольно забавно, но не очень хороший ответ на вопрос с меткой «новичок». Просто чтобы прояснить: в 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
Поскольку это не массив Python, а список Python, не будет ли проще назвать его «my_list»?
Маттис Асп
4
Это создает список, а не массив. Они разные и имеют разные свойства в питоне. В частности, вы можете выполнять числовые операции с массивом, но не со списком.
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 3print(a*1.5)# all elements of a times 1.5print(a.T+b)# b added to the transpose of a
эти массивы могут быть сохранены и загружены с диска (даже сжаты), а сложные вычисления с большим количеством элементов выполняются быстро, как C.
Многое используется в научной среде. Смотрите здесь для получения дополнительной информации.
согласна. кроме осторожности, чтобы назвать даже переменную "массив", или получить пурист гнев. к этому я бы также добавил, что вы можете аналогичным образом создавать «многомерные массивы»:x=[[0] * 10] * 10
Peter S Magnusson
17
В нескольких предложениях предполагается, что массивы в python представлены списками. Это неверно Python имеет независимую реализацию array()в стандартном библиотечном модуле array " array.array()", поэтому неправильно путать их. Списки - это списки в Python, поэтому будьте осторожны с используемой номенклатурой.
Есть одно очень важное различие между списком и array.array(). Хотя оба этих объекта являются упорядоченными последовательностями, array.array () является упорядоченной однородной последовательностью, тогда как список является неоднородной последовательностью.
Иногда вы должны объявить тип переменной: если вы не используете ее раньше, структуру управления, она не существует вне структуры управления, и тогда вы будете создавать новую переменную. Тогда предполагается, что переменная представляет собой тип int, что конфликтует, если вы используете его как более сложный тип.
уточняю
@ Разумеется, использование функций иногда требует их объявления, а иногда для воспроизведения некоторых глобальных переменных при использовании функций, и мы не хотим писать слишком много аргументов для функций.
m3nda
Это не просто функция; простое утверждение if может дать вам ту же проблему.
Яснее
1
Программирование - все о декларировании, независимо от того, какой язык вы используете.
Объявление типа
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
Адриан Томпкинс
13
Я обычно просто делаю, a = [1,2,3]что на самом деле, listно для arraysвзгляда на это формальное определение
Чтобы добавить к ответу Леннарта, массив может быть создан следующим образом:
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
Большинство методов для работы со списком также работают с массивом, распространенными из которых являются pop (), exte () и append ().
Судя по ответам и комментариям, кажется, что структура данных массива не так популярна. Хотя мне это нравится, так же, как можно предпочесть кортеж списку.
Структура массива имеет более строгие правила, чем список или np.array, и это может уменьшить количество ошибок и упростить отладку, особенно при работе с числовыми данными.
Попытки вставить / добавить float в массив int приведут к возникновению ошибки TypeError:
Хранение значений, которые должны быть целыми числами (например, список индексов) в форме массива, может поэтому предотвратить «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
Из-за этого не рекомендуется использовать np.array для команд, зависящих от типа. Структура массива здесь полезна. list сохраняет тип данных значений.
И для чего-то я нахожу довольно противным: тип данных указывается в качестве первого аргумента в array (), но (обычно) в качестве аргумента в np.array (). : |
Примечание: типизированный и довольно строгий характер массива больше склоняется к C, а не к Python, и в своем дизайне Python не имеет многих специфичных для типа ограничений в своих функциях. Его непопулярность также создает положительную обратную связь в совместной работе, и замена его в основном включает дополнительный [int (x) для x в файле]. Поэтому вполне целесообразно и разумно игнорировать существование массива. Это не должно мешать большинству из нас. : D
Я здесь, потому что я хотел декларацию 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, используя функцию изменения формы, которая принимает входные данные в качестве размеров матрицы.
__getitem__
не будет O (1).Ответы:
Теперь
variable
относится к пустому списку * .Конечно, это задание, а не декларация. В Python нет никакого способа сказать «эта переменная никогда не должна ссылаться ни на что, кроме списка», поскольку Python динамически типизирован.
* Встроенный тип Python по умолчанию называется списком , а не массивом. Это упорядоченный контейнер произвольной длины, который может содержать гетерогенную коллекцию объектов (их типы не имеют значения и могут свободно смешиваться). Это не следует путать с
array
модулем , который предлагает тип ближе кarray
типу C ; содержимое должно быть однородным (все одного типа), но длина по-прежнему динамична.источник
variable = ["Hi", "Hello"];
?)my_2x2_list = [[a, b], [c, d]]
. В зависимости от того, для чего вам нужны многомерные массивы, вы также можете подумать об использованииnumpy
, которое определяет типы массивов для многомерных однородных распакованных массивов, которые могут быть гораздо более эффективными, когда это применимо, поэтому они предпочтительнее для численных вычислений.Это удивительно сложная тема в Python.
Практический ответ
Массивы представлены классом
list
(см. Ссылку и не смешивайте их с генераторами ).Посмотрите примеры использования:
Теоретический ответ
Под капотом Python
list
находится обертка для реального массива, который содержит ссылки на элементы. Кроме того, базовый массив создается с дополнительным пространством.Последствия этого:
arr[6653]
же самоеarr[0]
)append
операция «бесплатно», в то время как дополнительное пространствоinsert
операция дорогаяПроверьте эту удивительную таблицу сложности операций .
Также, пожалуйста, посмотрите на эту картинку, где я попытался показать наиболее важные различия между массивом, массивом ссылок и связанным списком:
источник
[1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]
результат будет[2, 3, 4, 5, 6, 7]
a == b[:2]
возвращает True, если первые 2 элемента b равны значениям массива aВы на самом деле не объявляете вещи, но вот как вы создаете массив в Python:
Для получения дополнительной информации см. Модуль массива: http://docs.python.org/library/array.html.
Теперь возможно, вы не хотите массив, но список, но другие уже ответили на это. :)
источник
list
. Python имеет специальный тип данных, называемый an,array
который больше похож на массив C и мало используется.Я думаю, что вы (имели в виду) хотите список с уже заполненными первыми 30 ячейками. Так
Примером того, где это можно использовать, является последовательность Фибоначчи. Смотрите проблему 2 в Project Euler
источник
f = [0] * 30
вместо этого.Вот как:
источник
Для расчетов используйте массивы numpy :
эти массивы могут быть сохранены и загружены с диска (даже сжаты), а сложные вычисления с большим количеством элементов выполняются быстро, как C.
Многое используется в научной среде. Смотрите здесь для получения дополнительной информации.
источник
Комментарий Джона Мачина должен быть реальным ответом. Все остальные ответы - просто обходные пути, на мой взгляд! Так:
источник
x=[[0] * 10] * 10
В нескольких предложениях предполагается, что массивы в python представлены списками. Это неверно Python имеет независимую реализацию
array()
в стандартном библиотечном модулеarray
"array.array()
", поэтому неправильно путать их. Списки - это списки в Python, поэтому будьте осторожны с используемой номенклатурой.Есть одно очень важное различие между списком и
array.array()
. Хотя оба этих объекта являются упорядоченными последовательностями, array.array () является упорядоченной однородной последовательностью, тогда как список является неоднородной последовательностью.источник
Вы ничего не объявляете в Python. Вы просто используете это. Я рекомендую вам начать с чего-то вроде http://diveintopython.net .
источник
Я обычно просто делаю,
a = [1,2,3]
что на самом деле,list
но дляarrays
взгляда на это формальное определениеисточник
Чтобы добавить к ответу Леннарта, массив может быть создан следующим образом:
где значения могут принимать форму кортежа, списка или np.array, но не массива:
и результат будет все тот же:
Большинство методов для работы со списком также работают с массивом, распространенными из которых являются pop (), exte () и append ().
Судя по ответам и комментариям, кажется, что структура данных массива не так популярна. Хотя мне это нравится, так же, как можно предпочесть кортеж списку.
Структура массива имеет более строгие правила, чем список или np.array, и это может уменьшить количество ошибок и упростить отладку, особенно при работе с числовыми данными.
Попытки вставить / добавить float в массив int приведут к возникновению ошибки TypeError:
Хранение значений, которые должны быть целыми числами (например, список индексов) в форме массива, может поэтому предотвратить «TypeError: индексы списка должны быть целыми числами, а не с плавающей точкой», так как массивы могут быть перебраны, подобно np.array и lists:
Досадно, что добавление int в массив float приведет к тому, что int станет float, не вызывая исключения.
np.array также сохраняет тот же тип данных для своих записей, но вместо сообщения об ошибке он изменит свой тип данных, чтобы соответствовать новым записям (обычно удваивается или str):
Это верно и во время выполнения задания. Если указан тип данных, np.array, по возможности, преобразует записи в этот тип данных:
или, по сути:
в то время как массив просто даст:
Из-за этого не рекомендуется использовать np.array для команд, зависящих от типа. Структура массива здесь полезна. list сохраняет тип данных значений.
И для чего-то я нахожу довольно противным: тип данных указывается в качестве первого аргумента в array (), но (обычно) в качестве аргумента в np.array (). : |
Отношение к C упоминается здесь: список Python против массива - когда использовать?
Веселитесь, исследуя!
Примечание: типизированный и довольно строгий характер массива больше склоняется к C, а не к Python, и в своем дизайне Python не имеет многих специфичных для типа ограничений в своих функциях. Его непопулярность также создает положительную обратную связь в совместной работе, и замена его в основном включает дополнительный [int (x) для x в файле]. Поэтому вполне целесообразно и разумно игнорировать существование массива. Это не должно мешать большинству из нас. : D
источник
Как насчет этого...
источник
Python называет их списками . Вы можете написать список литералов в квадратных скобках и запятых:
источник
Вслед за Леннартом есть еще numpy, который реализует однородные многомерные массивы.
источник
У меня был массив строк, и мне требовался массив логических значений той же длины, инициализированный как True. Это то что я сделал
источник
int count[26]={0};
возможно, есть лучший способ, но этот вариантbools
сверху сработалcount=[0 for ii in range(26)]
позже, затем я изменил его на тот,count=[0]*26
который кажется предпочтительным.Вы можете создавать списки и конвертировать их в массивы или создавать массивы с помощью модуля numpy. Ниже приведено несколько примеров, иллюстрирующих то же самое. Numpy также облегчает работу с многомерными массивами.
Вы также можете преобразовать этот массив в матрицу 2X2, используя функцию изменения формы, которая принимает входные данные в качестве размеров матрицы.
источник