Python'da bir dizi nasıl bildirilir?


490

Python'da bir diziyi nasıl bildiririm ?

Belgelerde dizilere referans bulamıyorum.


121
Bazı anlaşılmaz nedenlerden ötürü, Python dizileri "listeler" olarak adlandırır. "Herkes bilir-bu-ne-ne-denir-biz-denir-biz-onu-başka-bir şey-diyebiliriz" dil tasarım okulu. Bir dizi yerine bağlantılı bir listeye benzediğinden, özellikle kötü bir ad seçimi.
Glenn Maynard

42
@Glenn Maynard: muhtemelen C benzeri dillerde diziler Python listeleri sabitken sabit uzunluktadır. Daha çok C ++'daki STL vektörü veya Java'daki ArrayList gibi.
MAK

128
Buna liste deniyor, çünkü bir liste. [A (), 1, 'Foo', u'öäöäö ', 67L, 5.6]. Bir liste. Dizi, "bilgisayar belleğindeki eşit aralıklı adreslerdeki öğelerin düzenlenmesidir" (wikipedia).
Lennart Regebro

35
Evrensel olarak anlaşılan "dizi" terimi hakkında hiçbir şey sabit bir uzunluk veya içerik hakkında herhangi bir şey önermez; bunlar C'nin dizileri özel olarak uygulamasının sınırlamalarıdır. Python listeleri eşit aralıklarla yerleştirilir (dahili olarak nesnelere işaret eder), aksi __getitem__takdirde O (1) olmaz.
Glenn Maynard

24
@Glenn, en.wikipedia.org/wiki/Array_data_styapı: "Bir dizi veri yapısı öğelerinin aynı boyutta olması gerekir" (Python dizileri için doğru, Python listeleri için doğru değil) ve "geçerli dizin kümeleri kümesi ve elemanların adresleri (ve dolayısıyla eleman adresleme formülü) genellikle dizi kullanılırken sabitlenir "(liste veya dizi için Python'da doğru değildir).
Alex Martelli

Yanıtlar:


358
variable = []

Şimdi variableboş bir listeye * işaret ediyor .

Tabii ki bu bir görev değil, bir açıklama değil. Python'da dinamik olarak yazıldığından, Python'da "bu değişken hiçbir zaman listeden başka bir şeye başvurmamalıdır" demenin bir yolu yoktur.


* Varsayılan yerleşik Python türüne dizi değil liste denir . Heterojen bir nesne koleksiyonunu tutabilen (uzunlukları önemli olmayan ve serbestçe karıştırılabilen) keyfi uzunlukta sıralı bir kaptır. Bu , C tipine daha yakın bir tip sunan arraymodülle karıştırılmamalıdır array; içerikler homojen olmalıdır (hepsi aynı türden), ancak uzunluk hala dinamik.


11
JavaScript'te olduğu gibi dizinin içeriğini başlatmak mümkün müdür? (örneğin, as variable = ["Hi", "Hello"];?)
Anderson Green

6
@AndersonGreen Evet.
sepp2k

3
Çok boyutlu bir diziyi (örneğin, bir 2D dizi?) Nasıl bildirirsiniz?
Anderson Green

7
@AndersonGreen Dediğim gibi Python'da değişken bir bildirim diye bir şey yok. : Boş bir liste alıyor ve içindeki diğer listeleri koyarak veya listenin boyutları yazma anında bilinen yerse, aynen bu şekilde bir değişmez olarak yazabilirim tarafından çok boyutlu bir liste oluşturur my_2x2_list = [[a, b], [c, d]]. Çok boyutlu dizilere ihtiyaç duyduğunuz şeye bağlı olarak, numpyuygulanabilir olduğunda çok daha verimli olabilen çok boyutlu, homojen, kutulanmamış diziler için dizi türlerini tanımlayan kullanmayı da düşünebilirsiniz , bu nedenle sayısal hesaplamalar için tercih edilirler.
sepp2k

1
@IfanIqbal Evet, en az bir öğe içeriyorsa, bunu yapabilirsiniz.
sepp2k

136

Bu Python'da şaşırtıcı derecede karmaşık bir konudur.

Pratik cevap

Diziler sınıfla temsil edilir list( referansa bakın ve bunları jeneratörlerle karıştırmayın ).

Kullanım örneklerine göz atın:

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

Teorik cevap

Kaputun altında Python's list, öğelere referanslar içeren gerçek bir dizi için bir sarıcıdır. Ayrıca, altta yatan dizi biraz ekstra alanla oluşturulur.

Bunun sonuçları:

  • rastgele erişim gerçekten ucuz (arr[6653] aynı arr[0])
  • append biraz 'ekstra alan' operasyonu 'ücretsiz'
  • insert operasyon pahalı

Bu harika operasyon karmaşıklığı tablosunu kontrol edin .

Ayrıca, dizi, referanslar dizisi ve bağlantılı liste arasındaki en önemli farklılıkları göstermeye çalıştığım bu resme bakın: diziler, her yerde diziler


5
Sadece eklemek için, python dizileri kesmek için gerçekten harika bir yol var: [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]sonuç olacak[2, 3, 4, 5, 6, 7]
Anton Purin

2
Zaman zaman bu yazı için bazı aşağı oylar görüyorum. Birinin neden bir kelime yayınlayabilmesi harika olurdu. Teşekkürler.
Anton Purin

2
Sen de gerçek bir MVP. Makul programlama kararları alabilmek için seçilen 'liste' tasarımını bilmeniz gerekir. Temelde C ++ 'da bir' vektör 'gibidir. Teşekkürler!
Necro

Bu, bazı büyük açıklamalarla gerçek uzun bir cevap!
Ahmed

Örneğin ben, karşılaştırma için pratik gösterimini ekleme olabilir: a == b[:2]döner doğru ilk 2 başvurularak b dizisi değerleri eşittir a
Bruno L.

124

Aslında bir şey beyan etmiyorsunuz, ancak Python'da şu şekilde bir dizi oluşturuyorsunuz:

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

Daha fazla bilgi için dizi modülüne bakın: http://docs.python.org/library/array.html

Artık bir dizi değil, bir liste istemek mümkün, ancak diğerleri bunu zaten yanıtladı. :)


10
Bu biraz komik, ama "acemi" etiketli bir soru için gerçekten iyi bir cevap değil. Açıkça söylemek gerekirse: Python'da genellikle a adında bir veri türü kullanırsınız list. Python array, daha çok bir C dizisine benzeyen ve az kullanılan özel amaçlı bir veri türüne sahiptir.
steveha

63
Hayır, ancak herkes zaten bir liste kullandı. Dizilerin de olduğunu belirtmenin iyi bir cevap olacağını düşündüm.
Lennart Regebro

8
Bu cevap için süper deli sahne. Python'da yıllardır programlama yapıyorum ve son zamanlarda liste nesnelerinden farklı gerçek bir Python dizi nesnesi olduğunu fark ettim. Veri yapısı çok benzer olmakla birlikte, diziler dizinin tutabileceği nesne türünü sınırlar. Harika cevap @LennartRegebro!
Josh Brown

4
Bu doğru cevap olmalı Liste ve Diziler iki farklı şeydir @LennartRegebro teşekkürler
Mina Gabriel

Listeler yerine diziler kullanmak istemenizin belirli bir nedeni vardır. Özellikle, sayılarla dolu myarray adlı bir diziniz varsa, ona karşı matematiksel işlemler gerçekleştirebilirsiniz ve bu işlemler içindeki tüm öğelere uygulanır. Yani, myarray / 3 komutunu çalıştırırsanız, içerideki her sayı 3'e bölünür. Aynı şeyi bir listeyle yapmaya çalışırsanız, bir hata alırsınız. Bu nedenle, diziler büyük sayı veri kümeleri için daha verimlidir.
Matthew

66

Bence ilk 30 hücre dolu bir liste istiyorsun. Yani

   f = []

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

Bunun kullanılabileceği bir örnek Fibonacci dizisidir. Project Euler'deki 2. sorunu inceleyin


96
Bu, bir listeyi başlatmanın oldukça barok bir yoludur. f = [0] * 30Bunun yerine deneyin .
John Machin

@Slehar anwer ile a = aralığı (10) ile aynı değil mi? Python'u seviyorum, sözdizimi ve Zen.
m3nda

@ erm3nda nope: $ python3 Python 3.4.2 [...] >>> a = aralık (10) >>> print (a) aralık (0, 10) >>>
arp

37

Bu nasıl:

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

4
Bu bir python dizisi değil, python listesi olduğundan, "my_list" olarak adlandırmak daha az kafa karıştırıcı olmaz mı?
Mattis Asp

4
Bu bir dizi değil bir liste oluşturur. Farklıdır ve python'da farklı özelliklere sahiptir. Özellikle, bir diziye karşı sayısal işlemler gerçekleştirebilirsiniz, ancak bir listeye karşı gerçekleştiremezsiniz.
Matthew

21

Hesaplamalar için, bunun gibi sayısal diziler kullanın :

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

bu numpy dizileri kaydedilebilir ve diskten yüklenebilir (sıkıştırılmış olsa bile) ve büyük miktarda element içeren karmaşık hesaplamalar C benzeri hızlıdır.

Bilimsel ortamlarda çok kullanılır. Daha fazlası için buraya bakın .


17

JohnMachin'in yorumu gerçek cevap olmalı. Diğer tüm cevaplar bence sadece geçici çözümlerdir! Yani:

array=[0]*element_count

Katılıyorum. değişken "dizi" bile çağırmak veya saf gazabı almak dikkatli. buna ben de benzer şekilde "çok boyutlu diziler" oluşturabilirsiniz ekleyebilirim:x=[[0] * 10] * 10
Peter S Magnusson

17

Birkaç katkı, python'daki dizilerin listelerle temsil edildiğini öne sürdü. Bu yanlış. Python, " " array()standart kütüphane modülünde bağımsız bir uygulamaya sahiptir , bu nedenle ikisini karıştırmak yanlıştır. Listeler python'daki listelerdir, bu nedenle kullanılan terminolojiye dikkat edin.arrayarray.array()

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

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

List ile arasında çok önemli bir fark vardır array.array(). Bu nesnelerin her ikisi de sıralı dizilerken, array.array () sıralı bir homojen dizidir, bir liste de homojen olmayan bir dizidir.


16

Python'da hiçbir şey beyan etmiyorsunuz. Sadece kullan. Http://diveintopython.net gibi bir şeyle başlamanızı öneririm .


2
Bazı zamanlarda bir değişkenin türünü bildirmelisiniz: eğer daha önce kullanmazsanız, bir kontrol yapısı, kontrol yapısının dışında mevcut değildir ve daha sonra yeni bir değişken oluşturacaksınız. Varsayım, değişkenin daha karmaşık bir tür olarak kullanırsanız çakışan bir int olduğu varsayımıdır.
Daha net

@Clearer yes, işlevleri kullanmak bazen bildirmek ve bazen işlevleri kullanırken bazı globaller oynamak ve işlevler hakkında çok fazla argüman yazmak istemez.
m3nda

Sadece işlev değil; basit bir if ifadesi size aynı sorunu verebilir.
Daha net

1
Programlama, hangi dili kullanırsanız kullanın, bildirimle ilgilidir. Tür bildirme tamamen farklı bir hikaye
Outside_Box

Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir.
Adrian Tompkins


11

Lennart'ın cevabına eklemek için şöyle bir dizi oluşturulabilir:

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

burada değerler bir demet, liste veya np.array biçiminde olabilir, ancak dizi olamaz:

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

ve çıktı yine aynı olacaktır:

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

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

Liste için çoğu yöntem dizi ile de çalışır, yaygın olanları pop (), expand () ve append () şeklindedir.

Cevaplar ve yorumlardan yola çıkarak, dizi veri yapısının o kadar popüler olmadığı anlaşılıyor. Yine de, bir liste üzerinde bir tuple tercih gibi aynı şekilde seviyorum.

Dizi yapısının bir liste veya np.array'den daha katı kuralları vardır ve bu özellikle sayısal verilerle çalışırken hataları azaltabilir ve hata ayıklamayı kolaylaştırabilir.

Bir int dizisine kayan nokta ekleme / ekleme girişimleri bir TypeError atar:

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

Dizi formunda tamsayıların olması gereken değerlerin (örn. Dizinler listesi) tutulması bu nedenle diziler np.array ve listelere benzer şekilde yinelenebildiğinden, "TypeError: liste dizinleri float değil tamsayı olmalıdır" ifadesini engelleyebilir:

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

Can sıkıcı bir şekilde, bir float dizisine int eklemek, int'in istisna atmadan float haline gelmesine neden olur.

np.array, girişleri için de aynı veri türünü korur, ancak hata vermek yerine, veri türünü yeni girişlere sığacak şekilde değiştirir (genellikle iki veya 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

Bu, görevlendirme sırasında da geçerlidir. Veri türü belirtilirse, np.array girdileri mümkün olan her yerde bu veri türüne dönüştürür:

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

veya özünde:

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

dizi sadece verir:

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

Bu nedenle, türe özgü komutlar için np.array kullanmak iyi bir fikir değildir. Dizi yapısı burada yararlıdır. listesi, değerlerin veri türünü korur.

Ve oldukça sinir bozucu bulduğum bir şey için: veri türü, dizi () 'de ilk argüman olarak belirtilir, ancak (genellikle) np.array ()' de ikinci argüman olarak belirtilir. : |

C ile olan ilişki burada belirtilmektedir: Python List ve Array - ne zaman kullanılır?

Eğlenceli keşifler!

Not: Dizinin yazılan ve oldukça katı doğası Python'dan ziyade C'ye doğru eğilir ve tasarım gereği Python'un işlevlerinde birçok türe özgü kısıtlama yoktur. Popülaritesi, işbirlikçi çalışmalarda da olumlu bir geri bildirim yaratır ve bunun değiştirilmesi çoğunlukla dosyadaki x için ek bir [int (x)] içerir. Bu nedenle dizinin varlığını göz ardı etmek tamamen uygulanabilir ve mantıklıdır. Çoğumuzu hiçbir şekilde engellememelidir. : D


8

Buna ne dersin...

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

6

Python onlara listeler diyor . Köşeli parantez ve virgül içeren bir liste hazır bilgisi yazabilirsiniz:

>>> [6,28,496,8128]
[6, 28, 496, 8128]

5

Lennart'tan sonra, homojen çok boyutlu dizileri uygulayan numpy de var .


4

Dizeleri bir dizi vardı ve True başlatılan booleans aynı uzunlukta bir dizi gerekli. Ben de öyle yaptım

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

Buradayım çünkü C bildirimini istedim: int count[26]={0}; Muhtemelen daha iyi bir yol var ama boolsyukarıdan gelen bu varyant count=[0 for ii in range(26)]Daha sonra çalıştı , daha sonra count=[0]*26tercih edilen gibi değiştirdim .
user1683793

2

Listeler oluşturabilir ve bunları dizilere dönüştürebilir veya numpy modülünü kullanarak dizi oluşturabilirsiniz. Aşağıda bunu gösteren birkaç örnek bulunmaktadır. Numpy ayrıca çok boyutlu dizilerle çalışmayı da kolaylaştırır.

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

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

Ayrıca, matrisin boyutları olarak girdi alan yeniden şekillendirme işlevini kullanarak bu diziyi 2X2 matrisine yeniden şekillendirebilirsiniz.

mat = a.reshape(2, 2)
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.