Jika indeks daftar ada, lakukan X

128

Dalam program saya, pengguna memasukkan nomor n, dan kemudian memasukkan njumlah string, yang disimpan dalam daftar.

Saya perlu kode sedemikian rupa sehingga jika ada indeks daftar tertentu, kemudian jalankan fungsi.

Ini dibuat lebih rumit oleh fakta bahwa saya telah bersarang jika pernyataan tentang len(my_list).

Berikut adalah versi sederhana dari apa yang saya miliki sekarang, yang tidak berfungsi:

n = input ("Define number of actors: ")

count = 0

nams = []

while count < n:
    count = count + 1
    print "Define name for actor ", count, ":"
    name = raw_input ()
    nams.append(name)

if nams[2]: #I am trying to say 'if nams[2] exists, do something depending on len(nams)
    if len(nams) > 3:
        do_something
    if len(nams) > 4
        do_something_else

if nams[3]: #etc.
pengguna1569317
sumber
1
Sepertinya Anda ingin mengetikkan pemeran nsebagai bilangan bulat, bukan daftar. Saya bingung.
mVChr
2
Ya, masalah sebenarnya di sini adalah menggunakan nbukan namsdi ifs
Wooble
Dalam kasus Anda, n bukan daftar. Pertama, centang (cast) itu menjadi bilangan bulat, maka Anda bisa iterate atau enumerate tergantung pada efek yang ingin Anda capai.
laidback
Yap, salah ketik. Diperbaiki ke nams []
user1569317
"fakta bahwa saya memiliki pernyataan sub if tentang len (my_list)." Sudahkah Anda memikirkan apa yang tersirat tentang indeks daftar mana yang ada, oleh fakta bahwa lendaftar tersebut setidaknya memiliki nilai tertentu?
Karl Knechtel

Jawaban:

157

Mungkinkah lebih bermanfaat bagi Anda untuk menggunakan panjang daftar len(n)untuk menginformasikan keputusan Anda daripada memeriksa n[i]untuk setiap panjang yang mungkin?

JonathanV
sumber
6
Ya. Setelah meninjau kode, pengaturan saya benar-benar berlebihan; len (n) menyelesaikan semua yang saya butuhkan. Terima kasih atas poin di arah yang benar.
user1569317
1
Ini tidak memperhitungkan indeks negatif. Cara terbaik yang saya tahu adalah mencoba / kecuali IndexError, tapi alangkah baiknya memiliki cara ringkas untuk mendapatkan bool
Abram
Dalam indeks negatif Python pada daftar hanya menghitung mundur dari akhir daftar. Jadi mereka tidak bisa ada dengan cara yang berdampak pada panjang daftar.
JonathanV
84

Saya perlu kode sedemikian rupa sehingga jika ada indeks daftar tertentu, kemudian jalankan fungsi.

Ini adalah penggunaan yang sempurna untuk blok percobaan :

ar=[1,2,3]

try:
    t=ar[5]
except IndexError:
    print('sorry, no 5')   

# Note: this only is a valid test in this context 
# with absolute (ie, positive) index
# a relative index is only showing you that a value can be returned
# from that relative index from the end of the list...

Namun, menurut definisi, semua item dalam daftar Python ada 0dan len(the_list)-1ada (yaitu, tidak perlu dicoba, kecuali jika Anda tahu 0 <= index < len(the_list)).

Anda bisa menggunakan penghitungan jika Anda ingin indeks antara 0 dan elemen terakhir:

names=['barney','fred','dino']

for i, name in enumerate(names):
    print(i + ' ' + name)
    if i in (3,4):
        # do your thing with the index 'i' or value 'name' for each item...

Jika Anda mencari pemikiran 'indeks' tertentu, saya pikir Anda mengajukan pertanyaan yang salah. Mungkin Anda harus mempertimbangkan untuk menggunakan wadah pemetaan (seperti dict) versus wadah urutan (seperti daftar). Anda dapat menulis ulang kode Anda seperti ini:

def do_something(name):
    print('some thing 1 done with ' + name)

def do_something_else(name):
    print('something 2 done with ' + name)        

def default(name):
    print('nothing done with ' + name)     

something_to_do={  
    3: do_something,        
    4: do_something_else
    }        

n = input ("Define number of actors: ")
count = 0
names = []

for count in range(n):
    print("Define name for actor {}:".format(count+1))
    name = raw_input ()
    names.append(name)

for name in names:
    try:
        something_to_do[len(name)](name)
    except KeyError:
        default(name)

Berjalan seperti ini:

Define number of actors: 3
Define name for actor 1: bob
Define name for actor 2: tony
Define name for actor 3: alice
some thing 1 done with bob
something 2 done with tony
nothing done with alice

Anda juga dapat menggunakan metode .get daripada mencoba / kecuali untuk versi yang lebih pendek:

>>> something_to_do.get(3, default)('bob')
some thing 1 done with bob
>>> something_to_do.get(22, default)('alice')
nothing done with alice
dawg
sumber
3
coba blokir? Saya seorang pemula dalam Python tetapi ini sepertinya besar tidak, tidak dalam pemrograman ... pengecualian untuk kontrol aliran? Pengecualian harus untuk hal-hal yang tidak bisa kita kontrol kan?
Luis
3
@Luis Saya seorang pemula di Python juga, tapi dari apa yang saya baca penanganan pengecualian dalam contoh ini adalah gaya Python mempromosikan bahwa C / Java / C # tidak. Lihat stackoverflow.com/questions/11360858/…
Tinister
Kalimat 'semua indeks dalam daftar Python antara 0 dan len (daftar)' benar-benar salah. Katakanlah ada daftar x = [1, 2, 3] yang len_x = 3. Tidak ada indeks seperti 3. Kalimat seharusnya: 'semua indeks dalam daftar Python antara 0 dan len (daftar) - 1' .
Lior Magen
9
@LiorMagen: Anda benar dan saya mengeditnya. Itu agak keras untuk memilih posting yang cukup populer untuk kesalahan yang sangat besar. Komentar sederhana sudah cukup.
dawg
Saya akan menunjukkan bahwa menempel hal-hal di dalam trytidak tidak memberitahu Anda jika indeks ada hanya jika fetchable - take -1- indeks yang tidak benar-benar ada tetapi nilai akan dikembalikan.
George Mauer
17

len(nams)harus sama dengan ndi kode Anda. Semua indeks 0 <= i < n"ada".

jfs
sumber
15

Ini dapat dilakukan hanya dengan menggunakan kode berikut:

if index < len(my_list):
    print(index, 'exists in the list')
else:
    print(index, "doesn't exist in the list")
pengguna6039980
sumber
6

Saya perlu kode sedemikian rupa sehingga jika ada indeks daftar tertentu, kemudian jalankan fungsi.

Anda sudah tahu cara menguji ini dan sebenarnya sudah melakukan tes seperti itu dalam kode Anda .

Indeks berlaku untuk daftar panjang nyang 0melalui n-1inklusif.

Dengan demikian, daftar memiliki indeks i jika dan hanya jika panjang daftar setidaknya i + 1.

Karl Knechtel
sumber
Yap, saya punya alat untuk menyelesaikan masalah saya, hanya saja tidak menerapkannya dengan jelas. Terima kasih atas poin di arah yang benar.
user1569317
Terima kasih untuk ini, terutama kalimat terakhir, yang merupakan properti penting dari daftar Python yang membuatnya berbeda dari array JavaScript dan konstruksi serupa lainnya.
robert
6

Menggunakan panjang daftar akan menjadi solusi tercepat untuk memeriksa apakah ada indeks:

def index_exists(ls, i):
    return (0 <= i < len(ls)) or (-len(ls) <= i < 0)

Ini juga menguji indeks negatif, dan sebagian besar jenis urutan (Suka rangesdan strs) yang memiliki panjang.

Jika Anda perlu mengakses item di indeks itu setelah itu, lebih mudah untuk meminta maaf daripada izin , dan juga lebih cepat dan lebih Pythonic. Gunakan try: except:.

try:
    item = ls[i]
    # Do something with item
except IndexError:
    # Do something without the item

Ini akan bertentangan dengan:

if index_exists(ls, i):
    item = ls[i]
    # Do something with item
else:
    # Do something without the item
Artyer
sumber
3

Jika Anda ingin mengulang data aktor yang dimasukkan:

for i in range(n):
    if len(nams[i]) > 3:
        do_something
    if len(nams[i]) > 4:
        do_something_else
gepatino
sumber
1

ok, jadi saya pikir itu sebenarnya mungkin (demi argumen):

>>> your_list = [5,6,7]
>>> 2 in zip(*enumerate(your_list))[0]
True
>>> 3 in zip(*enumerate(your_list))[0]
False
avloss
sumber
meskipun ini akan lebih sederhana:3 in range(len(your_list)
avloss
1
atau bahkan ini 3 in xrange(len(your_list)- mungkin tidak bisa melakukan lebih baik dari ini
avloss
1

Anda dapat mencoba sesuatu seperti ini

list = ["a", "b", "C", "d", "e", "f", "r"]

for i in range(0, len(list), 2):
    print list[i]
    if len(list) % 2 == 1 and  i == len(list)-1:
        break
    print list[i+1];
Suresh Kumar
sumber
1

Oneliner:

do_X() if len(your_list) > your_index else do_something_else()  

Contoh lengkap:

In [10]: def do_X(): 
    ...:     print(1) 
    ...:                                                                                                                                                                                                                                      

In [11]: def do_something_else(): 
    ...:     print(2) 
    ...:                                                                                                                                                                                                                                      

In [12]: your_index = 2                                                                                                                                                                                                                       

In [13]: your_list = [1,2,3]                                                                                                                                                                                                                  

In [14]: do_X() if len(your_list) > your_index else do_something_else()                                                                                                                                                                      
1

Sekadar info. Imho, try ... except IndexErrorsolusi yang lebih baik.

Eduard Golubov
sumber
-3

Jangan biarkan ada ruang di depan tanda kurung Anda.

Contoh:

n = input ()
         ^

Kiat: Anda harus menambahkan komentar di atas dan / atau di bawah kode Anda. Bukan di belakang kode Anda.


Semoga harimu menyenangkan.

Tuan Robot
sumber
Selamat datang di SO! Balasan Anda lebih mirip komentar daripada jawaban. Setelah memiliki reputasi yang cukup, Anda dapat mengomentari setiap pos. Periksa juga apa yang bisa saya lakukan . Jika Anda bermaksud Menjawab, bacalah cara menjawab ini untuk mengikuti pedoman SO.
Thewaywewere
-3

Banyak jawaban, bukan yang sederhana.

Untuk memeriksa apakah indeks 'id' ada di kamus kamus:

dic = {}
dic['name'] = "joao"
dic['age']  = "39"

if 'age' in dic

mengembalikan true jika 'usia' ada.

Marco
sumber
1
Bukan jawaban yang bagus untuk pertanyaan itu. Pertanyaannya adalah tentang daftar, bukan kamus. Apa yang Anda usulkan tidak dapat dilakukan dalam kasus-kasus seperti ini: ["joao", 39]
Ruhrpottpatriot