Saya ingin membuat daftar kosong (atau apa pun cara terbaik) yang dapat menampung 10 elemen.
Setelah itu saya ingin menetapkan nilai dalam daftar itu, misalnya ini seharusnya menampilkan 0 hingga 9:
s1 = list();
for i in range(0,9):
s1[i] = i
print s1
Tetapi ketika saya menjalankan kode ini, itu menghasilkan kesalahan atau dalam kasus lain hanya menampilkan []
(kosong).
Adakah yang bisa menjelaskan mengapa?
[]
) menurut definisi memiliki nol elemen. Apa yang Anda tampaknya inginkan adalah daftar nilai falsy sepertiNone
,0
, atau''
.0
ke9
Anda harus benar-benar menggunakanfor i in range(0, 10)
, yang artinyafor (int i = 0, i < 10, i++)
.Jawaban:
Anda tidak dapat menetapkan ke daftar seperti
lst[i] = something
, kecuali daftar tersebut sudah diinisialisasi dengan setidaknyai+1
elemen. Anda harus menggunakan append untuk menambahkan elemen ke akhir daftar.lst.append(something)
.(Anda dapat menggunakan notasi penugasan jika Anda menggunakan kamus).
Membuat daftar kosong:
Menetapkan nilai ke elemen yang ada dari daftar di atas:
Ingatlah bahwa sesuatu seperti
l[15] = 5
masih akan gagal, karena daftar kami hanya memiliki 10 elemen.range (x) membuat daftar dari [0, 1, 2, ... x-1]
Menggunakan fungsi untuk membuat daftar:
Pemahaman daftar (Menggunakan kotak karena untuk rentang Anda tidak perlu melakukan semua ini, Anda bisa kembali
range(0,9)
):sumber
a = [0 for _ in range(10)]
Coba ini sebagai gantinya:
Di atas akan membuat daftar ukuran 10, di mana setiap posisi diinisialisasi
None
. Setelah itu, Anda dapat menambahkan elemen ke dalamnya:Diakui, itu bukan cara Pythonic untuk melakukan sesuatu. Lebih baik lakukan ini:
Atau bahkan lebih sederhana , dengan Python 2.x Anda dapat melakukan ini untuk menginisialisasi daftar dengan nilai dari 0 hingga 9:
Dan dengan Python 3.x:
sumber
lst = [''] * 10
ataulst = [0] * 10
arr = [None for _ in range(10)]
.Jawaban varunl saat ini diterima
Bekerja dengan baik untuk jenis non-referensi seperti angka. Sayangnya jika Anda ingin membuat daftar-daftar-Anda akan mengalami kesalahan referensi. Contoh dalam Python 2.7.6:
Seperti yang Anda lihat, setiap elemen menunjuk ke objek daftar yang sama. Untuk menyiasatinya, Anda dapat membuat metode yang akan menginisialisasi setiap posisi ke referensi objek yang berbeda.
Kemungkinan besar ada cara python bawaan untuk melakukan ini (alih-alih menulis fungsi), tapi saya tidak yakin apa itu. Dengan senang hati akan dikoreksi!
Sunting: Ini
[ [] for _ in range(10)]
Contoh:
sumber
append
sangat sering lebih rendah daripada pemahaman daftar. Anda dapat membuat daftar daftar via[ [] for _ in range(10)]
.Anda dapat
.append(element)
ke daftar, misalnya:s1.append(i)
. Apa yang saat ini Anda coba lakukan adalah mengakses elemen (s1[i]
) yang tidak ada.sumber
Ada dua metode "cepat":
Tampaknya
[None]*x
lebih cepat:Tetapi jika Anda setuju dengan rentang (mis.
[0,1,2,3,...,x-1]
), Makarange(x)
mungkin yang tercepat:sumber
list(range(n))
sebagai gantinya, karenarange()
tidak mengembalikan daftar tetapi merupakan iterator, dan itu tidak lebih cepat dari[None] * n
.Saya terkejut tidak ada yang menyarankan pendekatan sederhana ini untuk membuat daftar daftar kosong. Ini adalah utas lama, tetapi hanya menambahkan ini untuk kelengkapan. Ini akan membuat daftar 10 daftar kosong
sumber
x = [[]] * 10
adalah bahwa di yang terakhir, setiap elemen dalam daftar menunjuk ke objek daftar SAMA . Jadi kecuali Anda hanya ingin 10 salinan dari objek yang sama, gunakanrange
varian berbasis karena itu membuat 10 objek baru . Saya menemukan perbedaan ini sangat penting.(Ini ditulis berdasarkan versi asli dari pertanyaan.)
Semua daftar dapat menampung elemen sebanyak yang Anda suka, hanya tunduk pada batas memori yang tersedia. Satu-satunya "ukuran" dari daftar yang penting adalah jumlah elemen yang ada di dalamnya.
print display s1
bukan sintaks yang valid; berdasarkan deskripsi Anda tentang apa yang Anda lihat, saya anggap Anda maksudkandisplay(s1)
laluprint s1
. Agar itu dapat berjalan, Anda harus sudah mendefinisikan globals1
untuk masuk ke fungsi.Panggilan
display
tidak mengubah daftar yang Anda masukkan, seperti yang tertulis. Kode Anda mengatakan "s1
adalah nama untuk hal apa pun yang diteruskan ke fungsi; ok, sekarang hal pertama yang akan kita lakukan adalah melupakan hal itu sepenuhnya, dan mari kitas1
mulai merujuk sebagai gantinya ke yang baru dibuatlist
. Sekarang kita akan memodifikasi itulist
". Ini tidak berpengaruh pada nilai yang Anda masukkan.Tidak ada alasan untuk memberikan nilai di sini. (Tidak ada alasan nyata untuk membuat fungsi, tapi itu intinya.) Anda ingin "membuat" sesuatu, jadi itu adalah output dari fungsi Anda. Tidak diperlukan informasi untuk membuat hal yang Anda gambarkan, jadi jangan berikan informasi apa pun. Untuk mengeluarkan informasi,
return
itu.Itu akan memberi Anda sesuatu seperti:
Masalah berikutnya yang akan Anda perhatikan adalah bahwa daftar Anda sebenarnya hanya memiliki 9 elemen, karena titik akhir dilewati oleh
range
fungsi. (Sebagai catatan tambahan,[]
berfungsi sama baiknya denganlist()
, tanda titik koma tidak perlu,s1
adalah nama yang buruk untuk variabel, dan hanya satu parameter yang diperlukan untukrange
jika Anda memulai0
.) Jadi, Anda berakhir denganNamun, ini masih meleset dari sasaran;
range
bukan kata kunci ajaib yang merupakan bagian dari bahasafor
dan caradef
yang, melainkan itu fungsi. Dan coba tebak fungsi apa yang dikembalikan? Itu benar - daftar bilangan bulat itu. Jadi seluruh fungsi runtuhdan sekarang Anda mengerti mengapa kita tidak perlu menulis fungsi sendiri sama sekali;
range
sudah fungsi yang kita cari. Meskipun, sekali lagi, tidak perlu atau alasan untuk "pra-ukuran" daftar.sumber
Salah satu cara sederhana untuk membuat matriks ukuran 2D
n
menggunakan pemahaman daftar bersarang:sumber
Saya sedikit terkejut bahwa cara termudah untuk membuat daftar yang diinisialisasi adalah tidak ada dalam jawaban ini. Cukup gunakan generator dalam
list
fungsi:sumber
range(9)
dilist()
? Belumrange(9)
mengembalikan daftar?range
bukan daftar, atau generator. Ini adalah subkelas abadi bawaan dariSequence
.Inilah kode saya untuk daftar 2D dalam python yang akan membaca no. baris dari input:
sumber
Jawaban yang diterima memiliki beberapa gotcha. Sebagai contoh:
Jadi setiap kamus mengacu pada objek yang sama. Hal yang sama berlaku jika Anda menginisialisasi dengan array atau objek.
Anda bisa melakukan ini sebagai gantinya:
sumber
Saya menemukan pertanyaan SO ini sambil mencari masalah yang sama. Saya harus membangun array 2D dan kemudian mengganti beberapa elemen dari setiap daftar (dalam array 2D) dengan elemen dari dict. Saya kemudian datang di ini pertanyaan SO yang membantu saya, mungkin ini akan membantu pemula lainnya untuk berkeliling. Trik kuncinya adalah menginisialisasi array 2D sebagai array numpy dan kemudian menggunakan
array[i,j]
bukanarray[i][j]
.Untuk referensi, ini adalah potongan kode tempat saya harus menggunakan ini:
Sekarang saya tahu kita bisa menggunakan pemahaman daftar tetapi untuk kesederhanaan saya menggunakan nested for loop. Semoga ini bisa membantu orang lain yang menemukan posting ini.
sumber
Jadikan itu lebih dapat digunakan kembali sebagai suatu fungsi.
sumber
Untuk membuat daftar, cukup gunakan tanda kurung ini: "[]"
Untuk menambahkan sesuatu ke daftar, gunakan list.append ()
sumber
Kode ini menghasilkan array yang berisi 10 angka acak.
sumber