Bagaimana cara mendeklarasikan array dengan Python?

491

Bagaimana cara mendeklarasikan array dengan Python ?

Saya tidak dapat menemukan referensi untuk array dalam dokumentasi.

Peter Mortensen
sumber
121
Untuk beberapa alasan yang tidak terduga, Python memanggil array "daftar". Sekolah desain bahasa "semua orang-tahu-apa-ini-disebut-jadi-kita-akan-menyebutnya-sesuatu-yang lain". Ini adalah pilihan nama yang sangat buruk, karena lebih mirip daftar yang ditautkan daripada sebuah array.
Glenn Maynard
42
@ Glenn Maynard: mungkin karena dalam bahasa C-seperti array panjang tetap sedangkan daftar Python tidak. Lebih mirip STL vektor di C ++ atau ArrayList di Java.
MAK
128
Ini disebut daftar, karena daftar. [A (), 1, 'Foo', u'öäöäö ', 67L, 5.6]. Sebuah daftar. Array adalah "pengaturan item pada alamat yang berjarak sama dalam memori komputer" (wikipedia).
Lennart Regebro
35
Tidak ada apa pun tentang istilah "array" yang dipahami secara universal menunjukkan panjang yang pasti atau apa pun tentang konten; itu hanya keterbatasan implementasi array khusus C. Daftar python sama spasi (pointer ke objek, secara internal), atau yang lain __getitem__tidak akan O (1).
Glenn Maynard
24
@Glenn, dari en.wikipedia.org/wiki/Array_data_structure: "elemen-elemen struktur data array harus memiliki ukuran yang sama" (berlaku untuk array Python, tidak berlaku untuk daftar Python) dan "set tupel indeks yang valid dan alamat elemen (dan karenanya formula elemen pengalamatan) biasanya diperbaiki ketika array sedang digunakan "(tidak benar dalam Python untuk daftar atau array).
Alex Martelli

Jawaban:

358
variable = []

Sekarang variablemerujuk ke daftar kosong * .

Tentu saja ini adalah tugas, bukan deklarasi. Tidak ada cara untuk mengatakan dalam Python "variabel ini tidak boleh merujuk pada apa pun selain daftar", karena Python diketik secara dinamis.


* Jenis Python bawaan bawaan disebut daftar , bukan array. Ini adalah wadah yang dipesan dengan panjang sewenang-wenang yang dapat menampung koleksi benda yang heterogen (tipenya tidak penting dan dapat dicampur secara bebas). Ini tidak harus bingung dengan arraymodul , yang menawarkan tipe lebih dekat ke arraytipe C ; isinya harus homogen (semua jenisnya sama), tetapi panjangnya masih dinamis.

sepp2k
sumber
11
Apakah mungkin untuk menginisialisasi konten array, seperti dalam JavaScript? (mis. as variable = ["Hi", "Hello"];?)
Anderson Green
6
@AndersonGreen Ya.
sepp2k
3
Bagaimana Anda mendeklarasikan array multidimensi, lalu (mis., Array 2D?)
Anderson Green
7
@AndersonGreen Seperti yang saya katakan tidak ada deklarasi variabel dalam Python. Anda akan membuat daftar multidimensi dengan mengambil daftar kosong dan menempatkan daftar lain di dalam atau, jika dimensi daftar dikenal di write-waktu, Anda hanya bisa menulis itu sebagai literal seperti ini: my_2x2_list = [[a, b], [c, d]]. Bergantung pada apa yang Anda butuhkan untuk array multi dimensi, Anda juga dapat mempertimbangkan untuk menggunakan numpy, yang mendefinisikan tipe array untuk array multi-dimensi, homogen, tanpa kotak yang dapat menjadi jauh lebih efisien jika berlaku, sehingga lebih disukai untuk perhitungan numerik.
sepp2k
1
@IfanIqbal Ya, jika mengandung setidaknya satu elemen, Anda bisa.
sepp2k
136

Ini adalah topik yang sangat kompleks dengan Python.

Jawaban praktis

Array diwakili oleh kelas list(lihat referensi dan tidak mencampurnya dengan generator ).

Lihat contoh penggunaan:

# 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)

Jawaban teoretis

Di bawah tenda Python listadalah pembungkus untuk array nyata yang berisi referensi ke item. Juga, array yang mendasarinya dibuat dengan beberapa ruang ekstra.

Konsekuensi dari ini adalah:

  • akses acak sangat murah ( arr[6653]sama dengan arr[0])
  • append operasi 'gratis' sementara beberapa ruang ekstra
  • insert operasi itu mahal

Periksa tabel kerumitan operasi yang luar biasa ini .

Juga, silakan lihat gambar ini, di mana saya mencoba untuk menunjukkan perbedaan paling penting antara array, array referensi dan daftar tertaut: array, array di mana-mana

Anton Purin
sumber
5
Sebagai tambahan, ada cara yang sangat keren untuk memotong array dengan python: [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]hasilnya adalah[2, 3, 4, 5, 6, 7]
Anton Purin
2
Saya melihat beberapa suara untuk postingan ini dari waktu ke waktu. Alangkah baiknya jika seseorang bisa memposting kata mengapa. Terima kasih.
Anton Purin
2
Anda benar-benar MVP. Perlu mengetahui desain aktual yang dipilih dari 'daftar' untuk membuat keputusan pemrograman yang masuk akal. Pada dasarnya ini seperti 'vektor' dalam C ++. Terima kasih!
Necro
Ini adalah jawaban yang sangat panjang dengan penjelasan yang luar biasa!
Ahmed
Bolehkah saya menambahkan notasi praktis untuk perbandingan, misalnya: a == b[:2]mengembalikan True jika 2 elemen pertama dari b sama dengan nilai array a
Bruno L.
124

Anda sebenarnya tidak mendeklarasikan sesuatu, tetapi ini adalah cara Anda membuat array dengan Python:

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

Untuk info lebih lanjut, lihat modul array: http://docs.python.org/library/array.html

Sekarang mungkin Anda tidak ingin array, tetapi daftar, tetapi orang lain sudah menjawabnya. :)

Lennart Regebro
sumber
10
Ini agak lucu, tetapi bukan jawaban yang bagus untuk pertanyaan yang ditandai "pemula". Hanya untuk memperjelas: Dalam Python Anda biasanya menggunakan tipe data yang disebut a list. Python memiliki tipe data tujuan khusus yang disebut arrayyang lebih mirip array C dan sedikit digunakan.
steveha
63
Tidak, tetapi semua orang sudah menggunakan daftar. Saya pikir ini akan menjadi jawaban yang bagus untuk menunjukkan bahwa ada array juga.
Lennart Regebro
8
alat peraga super gila untuk jawaban ini. Saya telah memprogram dalam Python selama bertahun-tahun dan hanya baru-baru ini menyadari bahwa ada objek array Python aktual yang berbeda dari objek daftar. Walaupun struct data sangat mirip, array membatasi jenis objek yang bisa dipegang oleh array. Jawaban yang bagus @LennartRegebro!
Josh Brown
4
Ini seharusnya jawaban yang benar. Daftar dan Array adalah dua hal yang berbeda. Terima kasih @LennartRegebro
Mina Gabriel
Ada alasan khusus Anda mungkin ingin menggunakan array alih-alih daftar. Khususnya, jika Anda memiliki larik yang disebut myarray yang penuh dengan angka, Anda dapat melakukan operasi matematika melawannya, dan operasi itu diterapkan ke semua item di dalamnya. Jadi, jika Anda menjalankan myarray / 3, setiap angka di dalam dibagi dengan 3. Jika Anda mencoba melakukan hal yang sama dengan daftar, Anda akan mendapatkan kesalahan. Jadi, array lebih efisien untuk dataset angka yang besar.
Matius
66

Saya pikir Anda (dimaksudkan) ingin daftar dengan 30 sel pertama sudah terisi. Begitu

   f = []

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

Contoh ke mana ini dapat digunakan adalah dalam deret Fibonacci. Lihat masalah 2 di Project Euler

limitcracker
sumber
96
Itu cara yang agak baroque untuk menginisialisasi daftar. Mencobaf = [0] * 30 saja.
John Machin
Apakah tidak sama dengan kisaran = (10) dari @slehar anwer? Cinta python, ini sintaks dan Zen.
m3nda
@ erm3nda nggak: $ python3 Python 3.4.2 [...] >>> a = range (10) >>> print (a) range (0, 10) >>>
arp
37

Begini caranya:

my_array = [1, 'rebecca', 'allard', 15]
canadiancreed
sumber
4
Karena ini bukan array python tetapi daftar python, tidakkah akan membingungkan untuk menyebutnya "my_list"?
Mattis Asp
4
Itu membuat daftar, bukan array. Mereka berbeda dan memiliki sifat yang berbeda dalam python. Secara khusus, Anda dapat melakukan operasi numerik terhadap array, tetapi tidak terhadap daftar.
Matius
21

Untuk perhitungan, gunakan numpy array seperti ini:

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

array numpy ini dapat disimpan dan dimuat dari disk (bahkan dikompresi) dan perhitungan kompleks dengan sejumlah besar elemen C seperti cepat.

Banyak digunakan dalam lingkungan ilmiah. Lihat di sini untuk lebih lanjut.

Remi
sumber
17

Komentar JohnMachin harus menjadi jawaban nyata. Semua jawaban lain hanya solusi menurut pendapat saya! Begitu:

array=[0]*element_count
csabinho
sumber
setuju. kecuali hati-hati untuk memanggil bahkan variabel "array", atau mendapatkan amarah murni. untuk ini saya juga akan menambahkan bahwa Anda juga dapat membuat "array multidimensi":x=[[0] * 10] * 10
Peter S Magnusson
17

Beberapa kontribusi menyarankan agar array dalam python diwakili oleh daftar. Ini salah. Python memiliki implementasi independen array()dalam modul perpustakaan standar array " array.array()" sehingga tidak benar untuk membingungkan keduanya. Daftar adalah daftar dengan python jadi berhati-hatilah dengan nomenklatur yang digunakan.

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

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

Ada satu perbedaan yang sangat penting antara daftar dan array.array(). Sementara kedua objek ini adalah urutan yang diurutkan, array.array () adalah urutan yang homogen sedangkan daftar adalah urutan yang tidak homogen.

hussam
sumber
16

Anda tidak mendeklarasikan apa pun dengan Python. Anda cukup menggunakannya. Saya sarankan Anda mulai dengan sesuatu seperti http://diveintopython.net .

bayer
sumber
2
Beberapa kali Anda harus mendeklarasikan jenis variabel: jika Anda tidak menggunakannya sebelumnya, struktur kontrol, itu tidak ada di luar struktur kontrol dan Anda kemudian akan membangun variabel baru. Asumsinya kemudian bahwa variabel tersebut adalah int, yang berbenturan jika Anda menggunakannya sebagai tipe yang lebih kompleks.
jelas
@Clearer ya, menggunakan fungsi terkadang perlu mendeklarasikannya, dan kadang-kadang untuk memainkan beberapa global saat menggunakan fungsi dan tidak ingin menulis terlalu banyak argumen pada fungsi.
m3nda
Bukan hanya fungsi; pernyataan sederhana jika bisa memberi Anda masalah yang sama.
jelas
1
Pemrograman adalah tentang mendeklarasikan, apa pun bahasa yang Anda gunakan. Ketik mendeklarasikan adalah cerita yang sangat berbeda
Outside_Box
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
Adrian Tompkins
13

Saya biasanya hanya akan melakukannya a = [1,2,3] yang sebenarnya listtetapi untuk arraysmelihat definisi formal ini

bukan sequitor
sumber
11

Untuk menambah jawaban Lennart, sebuah array dapat dibuat seperti ini:

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

di mana nilai dapat berbentuk tuple, daftar, atau np.array, tetapi bukan 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

dan hasilnya akan tetap sama:

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

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

Sebagian besar metode untuk daftar bekerja dengan array juga, yang umum adalah pop (), extended (), dan append ().

Dilihat dari jawaban dan komentar, tampaknya struktur data array tidak begitu populer. Saya menyukainya, dengan cara yang sama seperti orang lebih suka tuple daripada daftar.

Struktur array memiliki aturan yang lebih ketat daripada daftar atau np.array, dan ini dapat mengurangi kesalahan dan membuat proses debug lebih mudah, terutama ketika bekerja dengan data numerik.

Upaya memasukkan / menambahkan float ke array int akan melempar 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

Menjaga nilai-nilai yang dimaksudkan sebagai bilangan bulat (misalnya daftar indeks) dalam bentuk array karena itu dapat mencegah "TypeError: indeks daftar harus bilangan bulat, bukan float", karena array dapat diulang, mirip dengan np.array dan daftar:

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

Yang menjengkelkan, menambahkan int ke float array akan menyebabkan int menjadi float, tanpa melempar pengecualian.

np.array juga mempertahankan tipe data yang sama untuk entri-entrinya, tetapi alih-alih memberikan kesalahan, ia akan mengubah tipe datanya agar sesuai dengan entri baru (biasanya menjadi dua kali lipat atau 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

Ini juga berlaku selama penugasan. Jika tipe data ditentukan, np.array akan, sedapat mungkin, mengubah entri menjadi tipe data tersebut:

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_'>

atau, pada intinya:

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

sedangkan array akan memberikan:

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

Karena itu, bukan ide yang baik untuk menggunakan np.array untuk perintah tipe-spesifik. Struktur array berguna di sini. daftar mempertahankan tipe data dari nilai-nilai.

Dan untuk sesuatu yang saya temukan agak sial: tipe data ditentukan sebagai argumen pertama dalam array (), tetapi (biasanya) yang kedua di np.array (). : |

Relasi ke C disebut di sini: Daftar Python vs. Array - kapan digunakan?

Selamat menjelajahi!

Catatan: Sifat array yang diketik dan agak condong lebih condong ke C daripada Python, dan secara desain Python tidak memiliki banyak batasan tipe-spesifik dalam fungsinya. Ketidakpopulerannya juga menciptakan umpan balik positif dalam kerja kolaboratif, dan menggantinya sebagian besar melibatkan [int (x) tambahan untuk file x]. Oleh karena itu sepenuhnya layak dan masuk akal untuk mengabaikan keberadaan array. Seharusnya tidak menghalangi kebanyakan dari kita dengan cara apa pun. : D

Melvin
sumber
8

Bagaimana dengan ini...

>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6
slehar
sumber
6

Python menyebut mereka daftar . Anda dapat menulis daftar literal dengan tanda kurung dan koma:

>>> [6,28,496,8128]
[6, 28, 496, 8128]
Kolonel Panic
sumber
5

Menyusul dari Lennart, ada juga numpy yang mengimplementasikan array multi-dimensi yang homogen.

camh
sumber
4

Saya memiliki berbagai string dan membutuhkan array dengan panjang boolean yang sama diinisiasi ke True. Inilah yang saya lakukan

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]
Pedro A. Aranda
sumber
Saya di sini karena saya menginginkan deklarasi C: int count[26]={0}; Mungkin ada cara yang lebih baik tetapi varian boolsdari atas ini berfungsi count=[0 for ii in range(26)]Kemudian, saya kemudian mengubahnya menjadi count=[0]*26yang tampaknya lebih disukai.
user1683793
2

Anda dapat membuat daftar dan mengubahnya menjadi array atau Anda dapat membuat array menggunakan modul numpy. Di bawah ini adalah beberapa contoh untuk menggambarkan hal yang sama. Numpy juga membuatnya lebih mudah untuk bekerja dengan array multi dimensi.

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

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

Anda juga dapat membentuk kembali array ini menjadi matriks 2X2 menggunakan fungsi membentuk kembali yang mengambil input sebagai dimensi dari matriks.

mat = a.reshape(2, 2)
Amit Prafulla
sumber