Python'da herhangi bir boyutta boş bir diziyi nasıl elde ederim?


120

Temelde bunun C ile eşdeğer bir python olmasını istiyorum:

int a[x];

ancak python'da şöyle bir dizi bildiriyorum:

a = []

ve sorun şu ki, aşağıdaki gibi değerlerle rastgele yuvalar atamak istiyorum:

a[4] = 1

ancak dizi boş olduğu için bunu python ile yapamam.

Yanıtlar:


240

"Dizi" derken aslında bir Python listesini kastediyorsanız, şunu kullanabilirsiniz:

a = [0] * 10

veya

a = [None] * 10

91
Dikkat etmeniz gereken bir şey a = [obj] * N, dizinin her bir öğesinde aynı nesnenin görünmesidir. Değişebilir bir nesne ise ve bir öğeyi değiştirirseniz, hepsi değişecektir. ... Ancak, tamsayılar (veya başka bir değişmez tür) kullanan bu örnek için, hiçbir fark yaratmaz. Ya da sadece elemanlara atarsanız, bu da sorun olmaz. (Bunu tam olarak bunu çok sık yaptığım için söylüyorum :))
dappawit

4
Bu beni ısırdı sert benim ilk Python projesi @dappawit üzerinde. Bu uyarıyı dikkate alın.
Nate

nesneler için aynı referansı oluşturur
Amr Alaa

22

Python'da tam olarak istediğini yapamazsın (eğer seni doğru okursam). Listenin her bir öğesi için (veya sizin adını verdiğiniz gibi dizi) değerler girmeniz gerekir.

Ama şunu dene:

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

Diğer türlerin listeleri için, 0 dışında bir şey kullanmak Noneda genellikle iyi bir seçimdir.


2
Bu cevap yanlışı sınırlar. range(N)Python <3.0 ise zaten bir liste oluşturacaktır.
Apalala

1
Doğru, bir liste oluşturacak. Verimlilik konusunda endişeleriniz varsa xrange(N), Python 2.x'te kullanabilirsiniz . Bununla birlikte, yanlışın nasıl sınırlandığından emin değilim. Bunu tercih ederim a = range(N)çünkü her öğe mantıklı bir "varsayılan" ile başlar. Sanırım bu bir fikir meselesi.
dappawit

16

Numpy kullanabilirsiniz:

import numpy as np

Boş Dizi Örneği :

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

7

Sadece listeyi bildirin ve her bir öğeyi ekleyin. Örneğin:

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

5
O zaman nasıl 'rastgele slotlar atarsınız'
Tdelang

5

ayrıca bunu listenin genişletme yöntemi ile genişletebilirsiniz.

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

1

Eğer (veya bu sorunun diğer araştırmacıların) aslında tamsayılar ile doldurmak için bitişik bir dizi oluştururken ilgilenen olsaydı, dikkate ByteArray ve 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
Bu kod soruyu çözebilirken, sorunun nasıl ve neden çözüldüğüne dair bir açıklama da dahil olmak üzere , gönderinizin kalitesini artırmaya gerçekten yardımcı olur ve muhtemelen daha fazla oy almanıza neden olur. Sadece şu anda soran kişi için değil, gelecekte okuyucular için soruyu yanıtladığınızı unutmayın. Açıklamalar eklemek ve hangi sınırlamaların ve varsayımların geçerli olduğuna dair bir gösterge vermek için lütfen yanıtınızı düzenleyin .
Daniil

0

Gerçekten C tarzı bir dizi istiyorsanız

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

Python'da başlatılmamış değişken kavramı olmadığını unutmayın . Değişken, bir değere bağlı bir addır, bu nedenle değerin bir şeye sahip olması gerekir. Yukarıdaki örnekte dizi sıfırlarla başlatılmıştır.

Bununla birlikte, düşük seviyeli şeyler için gerçekten ihtiyacınız olmadıkça, bu python'da nadirdir. Çoğu durumda, diğer yanıtların önerdiği gibi, boş bir liste veya boş bir numpy dizisi kullanmak daha iyidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.