Liste dizini varsa, X yapın


129

Benim programımda, kullanıcı sayıyı girer nve sonra nbir listede saklanan dizi sayısını girer .

Belirli bir liste dizini varsa, bir işlevi çalıştıracak şekilde kodlamam gerekiyor.

Bu, if ile ilgili ifadelerin iç içe geçmiş olması gerçeğiyle daha karmaşık hale geliyor len(my_list).

İşte şu anda sahip olduğum şeyin basitleştirilmiş bir versiyonu, bu çalışmıyor:

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.

1
Görünüşe göre cast'ı nliste olarak değil tam sayı olarak yazmak istiyorsunuz . Kafam karıştı.
mVChr

2
Evet, işte asıl sorun kullanıyor nyerine namsde ifs
Wooble

Sizin durumunuzda n bir liste değil. İlk önce tam sayı olup olmadığını kontrol edin (çevirin), ardından elde etmek istediğiniz etkiye bağlı olarak yineleyebilir veya numaralandırabilirsiniz.
huzurlu

Evet, yanlış yazılmış.
İsimlere

"len (my_list) hakkında alt if ifadelerim olduğu gerçeği." lenListenin en azından belirli bir değer olması gerçeğiyle, hangi liste indekslerinin var olduğu hakkında neyin ima edildiğini düşündünüz mü ?
Karl Knechtel

Yanıtlar:


157

Listenin uzunluğunu kullanmanız sizin için daha yararlı olabilir mi? len(n)n[i]Her olası uzunluğu kontrol etmek yerine, kararınızı bildirmek için olabilir mi?


6
Evet. Kodu gözden geçirdikten sonra, kurulumum tamamen gereksizdi; len (n) ihtiyacım olan her şeyi başardı. Doğru yöndeki bir nokta için teşekkürler.
user1569317

1
Bu, negatif endeksleri hesaba katmaz. Bildiğim en iyi yol, IndexError'ı dene / hariç tut, ama bir bool almanın kısa ve öz bir yolunun olması güzel olurdu
Abram

Python'da listelerdeki negatif indeksler, listenin sonundan geriye doğru sayılır. Dolayısıyla listenin uzunluğunu etkileyecek bir şekilde var olamazlar.
Jonathanv

84

Belirli bir liste dizini varsa, bir işlevi çalıştıracak şekilde kodlamam gerekiyor.

Bu, bir deneme bloğu için mükemmel bir kullanımdır :

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...

Bununla birlikte, tanım gereği, bir Python listesindeki tüm öğeler arasında 0ve len(the_list)-1vardır (yani, bilmiyorsanız denemeye gerek yoktur 0 <= index < len(the_list)).

0 ile son eleman arasında dizinler istiyorsanız numaralandırmayı kullanabilirsiniz :

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...

Tanımlanmış bir 'dizin' düşüncesi arıyorsanız, yanlış soruyu sorduğunuzu düşünüyorum. Belki de bir sıralama kapsayıcısına (liste gibi ) karşı bir eşleme kabı (dikte gibi) kullanmayı düşünmelisiniz . Kodunuzu şu şekilde yeniden yazabilirsiniz:

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)

Şöyle çalışır:

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

Daha kısa bir sürüm dışında try / yerine .get yöntemini de kullanabilirsiniz :

>>> something_to_do.get(3, default)('bob')
some thing 1 done with bob
>>> something_to_do.get(22, default)('alice')
nothing done with alice

3
engellemeyi dene Python'da yeni başlayan biriyim ama bu programlamada büyük bir hayır gibi görünüyor ... akış kontrolü için istisnalar? Kontrol edemediğimiz şeyler için istisna olmalı değil mi?
Luis

3
@Luis Python'da da yeni başlayan biriyim, ancak okuduğum kadarıyla bu örneklerde istisna işleme tarzı Python'un C / Java / C # uygulamasının desteklemediğini gösteriyor. Bkz stackoverflow.com/questions/11360858/...
Tinister

'Python listesindeki 0 ile len (liste) arasındaki tüm endeksler' cümlesi kesinlikle yanlıştır. Diyelim ki len_x = 3 olan bir x = [1, 2, 3] listesi var. 3. cümle şöyle olmalıydı: 'Python listesindeki 0 ile len (liste) - 1 arasındaki tüm indisler' .
Lior Magen

9
@LiorMagen: Haklısın ve ben onu düzenledim. Bu kadar bilgiçlik taslayan bir hata için oldukça popüler bir gönderiye oy vermek biraz zor. Basit bir yorum yeterli olacaktır.
dawg

Ben içeride şeyler yapışmasını işaret edeceğiz trygelmez değil take - endeksi okunabilecek sadece eğer varsa size haber -1- o endeks gerçekten değil var ama bir değer döndürülür.
George Mauer

17

len(nams)nkodunuzdaki ile eşit olmalıdır . Tüm dizinler 0 <= i < n"var".


15

Aşağıdaki kod kullanılarak basitçe yapılabilir:

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

6

Belirli bir liste dizini varsa, bir işlevi çalıştıracak şekilde kodlamam gerekiyor.

Bunu nasıl test edeceğinizi zaten biliyorsunuz ve aslında kodunuzda bu tür testleri zaten gerçekleştiriyorsunuz .

Uzunlukta bir listesi için geçerli endeksleri nvardır 0aracılığıyla n-1Anin.

Bu nedenle, bir listenin bir dizini vardır i ancak ve ancak listenin uzunluğu en az ise i + 1.


Evet, sorunumu çözecek araçlara sahiptim, sadece onları açıkça uygulamıyordum. Doğru yöndeki bir nokta için teşekkürler.
user1569317

Bunun için özellikle Python listelerinin önemli bir özelliği olan ve onları JavaScript dizilerinden ve diğer benzer yapılardan farklı kılan son cümle için teşekkürler.
robert

6

Listenin uzunluğunu kullanmak, bir dizinin olup olmadığını kontrol etmek için en hızlı çözüm olacaktır:

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

Bu ayrıca negatif indisleri ve uzunluğu olan çoğu dizi türünü (Like rangesve strs) test eder.

Zaten daha sonra bu dizindeki maddeye erişmeniz gerekirse, af dilemek izin istemekten daha kolaydır ve ayrıca daha hızlı ve daha Pythonic. Kullanın try: except:.

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

Bu, şunlara zıt olacaktır:

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

3

Eklenen aktör verilerini yinelemek istiyorsanız:

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

1

Tamam, bu yüzden aslında mümkün olduğunu düşünüyorum (tartışma uğruna):

>>> your_list = [5,6,7]
>>> 2 in zip(*enumerate(your_list))[0]
True
>>> 3 in zip(*enumerate(your_list))[0]
False

ancak bu daha da basit olurdu:3 in range(len(your_list)
avloss

1
hatta bu bile 3 in xrange(len(your_list)- muhtemelen bundan daha iyisini yapamaz
avloss

1

Bunun gibi bir şey deneyebilirsin

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];

1

Oneliner:

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

Tam örnek:

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

Sadece bilgi için. Imho, try ... except IndexErrordaha iyi bir çözüm.


-3

Braketlerinizin önünde boşluk bırakmayın.

Misal:

n = input ()
         ^

İpucu: Kodunuzun üzerine ve / veya altına yorumlar eklemelisiniz. Kodunuzun arkasında değil.


İyi günler.


SO'ya hoş geldiniz! Cevabınız bir cevaptan çok bir yoruma benziyor. Yeterli itibara sahip olduğunuzda , herhangi bir gönderi hakkında yorum yapabileceksiniz . Ayrıca bunun yerine ne yapabileceğimi de kontrol edin . Yanıtlamayı düşündüyseniz, SO yönergelerini takip etmek için bu nasıl yanıtlanacağını okuyun .
theway

-3

Pek çok cevap, basit olanı değil.

Sözlük diktinde bir dizin "id" olup olmadığını kontrol etmek için:

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

if 'age' in dic

"yaş" varsa doğru döndürür.


1
Soruya iyi bir cevap değil. Soru sözlüklerle değil, listeler hakkındaydı. Önerdiğiniz şey şu gibi durumlarda yapılamaz: ["joao", 39]
Ruhrpottpatriot
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.