Jeśli istnieje indeks listy, wykonaj X


128

W moim programie użytkownik wprowadza numer n, a następnie wprowadza nliczbę łańcuchów, które są zapisywane na liście.

Muszę zakodować w taki sposób, że jeśli istnieje określony indeks listy, uruchom funkcję.

Sytuację komplikuje fakt, że zagnieżdżałem oświadczenia if dotyczące len(my_list).

Oto uproszczona wersja tego, co mam teraz, która nie działa:

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
Wygląda na to, że chcesz wpisać rzutowanie njako liczbę całkowitą, a nie listę. Jestem zmieszany.
mVChr

2
Tak, prawdziwym problemem jest użycie nzamiast namsw ifs
Wooble

W twoim przypadku n nie jest listą. Najpierw sprawdź (rzuć), czy ma być liczbą całkowitą, a następnie możesz iterować lub wyliczać w zależności od efektu, który chcesz osiągnąć.
wyluzowany

Tak, źle wpisano. Naprawiono nams []
user1569317

„fakt, że mam oświadczenia sub if dotyczące len (my_list)”. Czy zastanawiałeś się, co jest implikowane z tego, które indeksy listy istnieją, z faktu, że lenlista jest przynajmniej pewną wartością?
Karl Knechtel

Odpowiedzi:


157

Czy byłoby bardziej przydatne, gdybyś wykorzystał długość listy len(n)do podjęcia decyzji, zamiast sprawdzać n[i]każdą możliwą długość?


6
Tak. Po przejrzeniu kodu moja konfiguracja była całkowicie zbędna; len (n) osiągnąłem wszystko, czego potrzebowałem. Dzięki za punkt we właściwym kierunku.
user1569317

1
To nie uwzględnia ujemnych indeksów. Najlepszym sposobem, jaki znam, jest spróbowanie / z wyjątkiem IndexError, ale dobrze byłoby mieć zwięzły sposób na uzyskanie wartości bool
Abram

W Pythonie ujemne indeksy na listach liczą się tylko wstecz od końca listy. Nie mogą więc istnieć w sposób wpływający na długość listy.
JonathanV

84

Muszę zakodować w taki sposób, że jeśli istnieje określony indeks listy, uruchom funkcję.

To idealne zastosowanie dla bloku próbnego :

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

Jednak z definicji wszystkie pozycje na liście Pythona między 0i len(the_list)-1istnieją (tj. Nie ma potrzeby próbować, chyba że wiesz 0 <= index < len(the_list)).

Możesz użyć enumerate, jeśli chcesz indeksy od 0 do ostatniego elementu:

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

Jeśli szukasz jakiejś określonej myśli „indeksowej”, myślę, że zadajesz niewłaściwe pytanie. Być może powinieneś rozważyć użycie kontenera mapowania (takiego jak dykt) zamiast kontenera sekwencji (takiego jak lista). Możesz przepisać swój kod w ten sposób:

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)

Działa tak:

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

Możesz także użyć metody .get zamiast próbować / z wyjątkiem krótszej wersji:

>>> 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
spróbować zablokować? Jestem początkującym w Pythonie, ale wydaje mi się, że to wielkie nie w programowaniu ... wyjątki dotyczące kontroli przepływu? Wyjątkiem powinny być rzeczy, których nie możemy kontrolować, prawda?
Luis

3
@Luis Jestem również początkującym w Pythonie, ale z tego, co przeczytałem o obsłudze wyjątków w tych przypadkach, wynika, że ​​Python promuje styl, którego C / Java / C # nie robi. Zobacz stackoverflow.com/questions/11360858/…
Tinister

Zdanie „wszystkie indeksy na liście Pythona od 0 do len (lista)” jest całkowicie błędne. Powiedzmy, że istnieje lista x = [1, 2, 3], której len_x = 3. Nie ma takiego indeksu jak 3. Zdanie powinno wyglądać następująco: 'wszystkie indeksy na liście Pythona od 0 do len (lista) - 1' .
Lior Magen,

9
@LiorMagen: Masz rację i zredagowałem to. To dość trudne do odrzucenia głosowanie na dość popularny post za taki pedantyczny błąd. Wystarczyłby prosty komentarz.
dawg,

Będę podkreślić, że trzymanie rzeczy Wewnątrz trynie nie powiedzieć, czy indeks istnieje tylko jeśli jest fetchable - przystawka -1- że wskaźnik tak naprawdę nie istnieje , ale wartość będzie zwracana.
George Mauer

17

len(nams)powinien być równy nw twoim kodzie. Wszystkie indeksy 0 <= i < n„istnieją”.


15

Można to zrobić po prostu za pomocą następującego kodu:

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

6

Muszę zakodować w taki sposób, że jeśli istnieje określony indeks listy, uruchom funkcję.

Wiesz już, jak to zrobić i faktycznie już wykonujesz takie testy w swoim kodzie .

Poprawne indeksy do listy długości n0poprzez n-1włącznie.

Zatem lista ma indeks i wtedy i tylko wtedy, gdy długość listy wynosi co najmniej i + 1.


Tak, miałem narzędzia do rozwiązania mojego problemu, ale nie zastosowałem ich jasno. Dzięki za punkt we właściwym kierunku.
user1569317

Dzięki za to, zwłaszcza ostatnie zdanie, które jest ważną właściwością list Pythona, która odróżnia je od tablic JavaScript i innych podobnych konstrukcji.
robert

6

Najszybszym sposobem sprawdzenia, czy indeks istnieje, byłoby użycie długości listy:

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

To również sprawdza ujemne indeksy i większość typów sekwencji (Like rangesi strs), które mają długość.

Jeśli i tak potrzebujesz później uzyskać dostęp do elementu w tym indeksie, łatwiej jest poprosić o przebaczenie niż o pozwolenie , a także jest szybszy i bardziej Pythonic. Użyj try: except:.

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

Byłoby to w przeciwieństwie do:

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

3

Jeśli chcesz iterować wstawione dane aktorów:

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

1

ok, więc myślę, że faktycznie jest to możliwe (ze względu na argument):

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

chociaż byłoby to jeszcze prostsze:3 in range(len(your_list)
avloss

1
a nawet to 3 in xrange(len(your_list)- prawdopodobnie nie da rady zrobić lepiej niż to
strata

1

Możesz spróbować czegoś takiego

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

Pełny przykład:

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

Tylko dla informacji. Imho, try ... except IndexErrorto lepsze rozwiązanie.


-3

Nie zostawiaj miejsca przed wspornikami.

Przykład:

n = input ()
         ^

Wskazówka: dodaj komentarze nad i / lub pod kodem. Nie za twoim kodem.


Miłego dnia.


Witamy w SO! Twoja odpowiedź wygląda raczej jak komentarz niż odpowiedź. Gdy zdobędziesz wystarczającą reputację , będziesz mógł komentować każdy post. Sprawdź też, co mogę zamiast tego zrobić . Jeśli masz zamiar odpowiedzieć, przeczytaj ten poradnik, aby postępować zgodnie z wytycznymi SO.
thewaywewyby

-3

Wiele odpowiedzi, ale nie ta prosta.

Aby sprawdzić, czy indeks 'id' istnieje w słowniku słownika:

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

if 'age' in dic

zwraca prawdę, jeśli istnieje „wiek”.


1
Nie jest to dobra odpowiedź na to pytanie. Pytanie dotyczyło list, a nie słowników. To, co zaproponowałeś, nie może zostać zrobione w takich przypadkach: ["joao", 39]
Ruhrpottpatriot
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.