Bagaimana cara mendapatkan array kosong dengan ukuran berapa pun dengan python?


120

Saya pada dasarnya ingin python yang setara dengan ini di C:

int a[x];

tetapi dengan python saya mendeklarasikan sebuah array seperti:

a = []

dan masalahnya adalah saya ingin menetapkan slot acak dengan nilai seperti:

a[4] = 1

tapi saya tidak bisa melakukannya dengan python, karena arraynya kosong.

Jawaban:


239

Jika dengan "array" yang Anda maksud adalah daftar Python, Anda dapat menggunakan

a = [0] * 10

atau

a = [None] * 10

91
Satu hal yang harus Anda perhatikan a = [obj] * Nadalah bahwa object yang sama muncul di setiap elemen dari array. Jika ini adalah obj yang bisa berubah, dan Anda memodifikasi satu item, semua akan berubah. ... Tetapi, untuk contoh ini menggunakan bilangan bulat (atau tipe tetap lainnya), tidak ada bedanya. Atau, jika Anda hanya menetapkan ke elemen, itu juga tidak menjadi masalah. (Saya menyebutkannya karena saya telah melakukannya terlalu sering terlalu sering :))
dappawit

4
Yang sedikit saya keras pada proyek Python pertama saya, @dappawit. Perhatikan peringatan ini.
The Nate

itu menciptakan referensi yang sama untuk objek
Amr Alaa

22

Anda tidak dapat melakukan apa yang Anda inginkan dengan Python (jika saya membacanya dengan benar). Anda perlu memasukkan nilai untuk setiap elemen dari daftar (atau seperti yang Anda sebut, array).

Tapi, coba ini:

a = [0 for x in range(N)]  # N = size of list you want
a[i] = 5  # as long as i < N, you're okay

Untuk daftar jenis lain, gunakan sesuatu selain 0. Noneseringkali juga merupakan pilihan yang baik.


2
Jawaban ini berbatasan dengan salah. range(N)sudah akan menghasilkan daftar jika Python <3.0.
Apalala

1
Benar, itu akan menghasilkan daftar. Jika Anda khawatir tentang efisiensi, Anda dapat menggunakan xrange(N)Python 2.x. Saya tidak yakin bagaimana itu berbatasan dengan yang salah. Saya lebih suka a = range(N)karena setiap elemen dimulai dengan "default" yang masuk akal. Saya kira ini masalah opini.
dappawit

16

Anda bisa menggunakan numpy:

import numpy as np

Contoh dari Empty Array :

np.empty([2, 2])
array([[ -9.74499359e+001,   6.69583040e-309],
       [  2.13182611e-314,   3.06959433e-309]])  

7

Cukup nyatakan daftarnya dan tambahkan setiap elemen. Misalnya:

a = []
a.append('first item')
a.append('second item')

5
Lalu bagaimana Anda akan 'menetapkan slot acak'
Tdelang

5

Anda juga dapat memperluasnya dengan metode daftar diperpanjang.

a= []
a.extend([None]*10)
a.extend([None]*20)

1

Jika Anda (atau pencari lain dari pertanyaan ini) sebenarnya tertarik untuk membuat array yang berdekatan untuk diisi dengan integer, pertimbangkan bytearray dan memoryivew :

# cast() is available starting Python 3.3
size = 10**6 
ints = memoryview(bytearray(size)).cast('i') 

ints.contiguous, ints.itemsize, ints.shape
# (True, 4, (250000,))

ints[0]
# 0

ints[0] = 16
ints[0]
# 16

1
x=[]
for i in range(0,5):
    x.append(i)
    print(x[i])

2
Meskipun kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan tentang bagaimana dan mengapa ini menyelesaikan masalah akan sangat membantu meningkatkan kualitas posting Anda, dan mungkin menghasilkan lebih banyak suara. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, bukan hanya orang yang bertanya sekarang. Harap edit jawaban Anda untuk menambahkan penjelasan dan memberikan indikasi batasan dan asumsi apa yang berlaku.
Daniil

0

Jika Anda benar-benar menginginkan array gaya C.

import array
a = array.array('i', x * [0])
a[3] = 5
try:
   [5] = 'a'
except TypeError:
   print('integers only allowed')

Perhatikan bahwa tidak ada konsep variabel yang tidak diinisialisasi dalam python. Variabel adalah nama yang terikat pada suatu nilai, sehingga nilai itu harus memiliki sesuatu. Pada contoh di atas, array diinisialisasi dengan nol.

Namun, hal ini jarang terjadi pada python, kecuali Anda benar-benar membutuhkannya untuk hal-hal tingkat rendah. Dalam kebanyakan kasus, Anda lebih baik menggunakan daftar kosong atau array numpy kosong, seperti yang disarankan jawaban lain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.