Як оголосити масив у Python?


490

Як я можу оголосити масив у Python ?

Я не можу знайти жодної посилання на масиви в документації.


121
З певних незрозумілих причин Python називає масиви "списками". Мовна конструкція мови "всі-знають-що-це-це називається-так-ми-збираємось називати-це-щось інше". Це особливо поганий вибір імені, оскільки він виглядає як пов'язаний список, а не масив.
Glenn Maynard

42
@Glenn Maynard: напевно, тому, що в C-подібних мовах масиви мають фіксовану довжину, тоді як списки Python не є. Він більше схожий на STL-вектор у C ++ або ArrayList на Java.
МАК

128
Це називається список, тому що це список. [A (), 1, 'Foo', u'öäöäö ', 67L, 5.6]. Лист. Масив - це "розташування елементів за однаково розташованими адресами в пам'яті комп'ютера" (wikipedia).
Леннарт Регебро

35
Ніщо про загальновизнаний термін "масив" не передбачає фіксовану довжину або що-небудь про зміст; це лише обмеження конкретної реалізації масивів C. Списки Python однаково розташовані (вказівники на об’єкти, всередині), інакше __getitem__не буде O (1).
Глен Мейнард

24
@Glenn, з en.wikipedia.org/wiki/Array_data_structure: "елементи структури даних масиву повинні мати однаковий розмір" (вірно для масивів Python, не вірно для списків Python) та "набір дійсних кортежів індексу та Адреси елементів (а отже, формула адресації елементів) зазвичай фіксуються під час використання масиву "(не вірно в Python ні для списку, ні для масиву).
Алекс Мартеллі

Відповіді:


358
variable = []

Тепер variableвідноситься до порожнього списку * .

Звичайно, це завдання, а не декларація. Немає способу сказати в Python "ця змінна ніколи не повинна посилатися ні на що, крім списку", оскільки Python динамічно набирається.


* Вбудований тип Python за замовчуванням називається списком , а не масивом. Це впорядкований контейнер довільної довжини, який може вмістити гетерогенну колекцію предметів (їх типи не мають значення і їх можна вільно змішувати). Це не слід плутати з arrayмодулем , який пропонує тип, наближений до arrayтипу С ; вміст повинен бути однорідним (все одного типу), але довжина все ще динамічна.


11
Чи можна було б ініціалізувати вміст масиву, як у JavaScript? (наприклад, як variable = ["Hi", "Hello"];?)
Андерсон Грін,

6
@AndersonGreen Так.
sepp2k

3
Як би ви оголосили багатовимірний масив тоді (наприклад, двовимірний масив?)
Андерсон Зелений

7
@AndersonGreen Як я вже сказав, у Python немає такого поняття, як оголошення змінної. Ви б створити багатомірний список, взявши порожній список і введення інших списків всередині або, якщо розміри списку відомі в запису час, ви могли б просто написати його в якості литерала , як це: my_2x2_list = [[a, b], [c, d]]. Залежно від того, для чого вам потрібні багатовимірні масиви, ви також можете розглянути можливість використання numpy, яке визначає типи масивів для багатовимірних, однорідних, необоснованих масивів, які можуть бути набагато ефективнішими, де це можливо, тому вони є кращими для чисельних обчислень.
sepp2k

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's 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, якщо перші два елементи b дорівнюють значенням масиву a
Bruno L.

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
Це має бути правильний список відповідей, а масиви - це дві різні речі @LennartRegebro дякую
Міна Габріель

Існує конкретна причина, чому ви можете використовувати масиви замість списків. Зокрема, якщо у вас масив з назвою myarray, повний чисел, ви можете виконувати проти нього математичні операції, і ці операції застосовуються до всіх елементів всередині нього. Отже, якщо ви будете виконувати myarray / 3, кожне число всередині ділиться на 3. Якщо ви спробуєте зробити те ж саме зі списком, ви отримаєте помилку. Отже, масиви ефективніші для великих наборів даних чисел.
Метью

66

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

   f = []

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

Приклад того, де це можна було б використати, є послідовністю Фібоначчі. Дивіться проблему 2 в Project Euler


96
Це досить бароковий спосіб ініціалізації списку. Спробуйте f = [0] * 30замість цього.
Джон Махін

Чи не те саме, що а = діапазон (10) від @slehar anwer? Любіть пітон, це синтаксис і це дзен.
м3нда

@ erm3nda nope: $ python3 Python 3.4.2 [...] >>> a = діапазон (10) >>> print (a) діапазон (0, 10) >>>
арп

37

Ось як:

my_array = [1, 'rebecca', 'allard', 15]

4
Оскільки це не масив python, а список python, чи не менш заплутаним буде це назвати "my_list"?
Меттіс Асп

4
Це створює список, а не масив. Вони різні і мають різні властивості у пітона. Зокрема, ви можете виконувати числові операції проти масиву, але не проти списку.
Метью

21

Для обчислень використовуйте масивні масиви на зразок цього:

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

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

Багато використовується в наукових середовищах. Дивіться тут докладніше.


17

Коментар ДжонМахіна повинен бути справжньою відповіддю. Всі інші відповіді, на мою думку, просто обхідні шляхи! Тому:

array=[0]*element_count

згоден. крім обережного, щоб зателефонувати навіть до змінної "масив" або отримати гнів пуристів. до цього я також додам, що ви можете так само створити "багатовимірні масиви":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 () є упорядкованими однорідними послідовностями, тоді як список є неоднорідною послідовністю.


16

Ви нічого не заявляєте в Python. Ви просто використовуєте його. Я рекомендую почати з чогось на зразок http://diveintopython.net .


2
Деколи ви повинні оголосити тип змінної: якщо ви не використовуєте її раніше, керуюча структура, вона не існує за межами структури управління, і тоді ви будете конструювати нову змінну. Тоді припущення полягає в тому, що змінна - це int, яка стикається, якщо використовувати її як складніший тип.
Чіткіший

@Clearer так, використовуючи функції, іноді потрібно декларувати це, а іноді відтворювати деякі глобальні під час використання функцій і не хочуть писати занадто багато аргументів на функції.
m3nda

Це не просто функція; простий, якщо заява може поставити вам таку ж проблему.
Чіткіший

1
Програмування стосується декларування, незалежно від того, якою мовою ви користуєтесь. Оголошення типу - це зовсім інша історія
Outside_Box

Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
Адріан Томпкінс


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 (), extension () та 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 та списків:

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 для команд, характерних для типу. Тут корисна структура масиву. Список зберігає тип даних значень.

І для чогось мені здається досить невдалим: тип даних задається як перший аргумент у масиві (), але (як правило) другий у np.array (). : |

Відносини до C згадуються тут: Список Python vs. Array - коли використовувати?

Приємно досліджуючи!

Примітка: Набраний і досить суворий характер масиву більше схиляється до C, а не до Python, і за дизайном Python не має багатьох специфічних обмежень у своїх функціях. Його непопулярність також створює позитивний відгук у спільній роботі, а його заміна в основному передбачає додатковий [int (x) для x у файлі]. Тому цілком життєздатним і розумним є ігнорування існування масиву. Це не повинно жодним чином перешкоджати більшості з нас. : D




5

Слідом за Lennart, є також numpy, який реалізує однорідні багатовимірні масиви.


4

У мене був масив рядків і мені потрібен масив однакової довжини булевих ініційованих до True. Це я і зробив

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]

Я тут, тому що я хотів декларації С: int count[26]={0}; Мабуть, кращий спосіб, але цей варіант boolsзверху працював count=[0 for ii in range(26)]пізніше, потім я змінив його на той, count=[0]*26що здається кращим.
користувач1683793

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.