Nếu chỉ mục danh sách tồn tại, làm X


128

Trong chương trình của tôi, người dùng nhập số n, rồi nhập nsố chuỗi, được lưu trong danh sách.

Tôi cần mã để nếu một chỉ mục danh sách nhất định tồn tại, sau đó chạy một hàm.

Điều này được làm cho phức tạp hơn bởi thực tế là tôi đã lồng nhau nếu các tuyên bố về len(my_list).

Đây là phiên bản đơn giản hóa của những gì tôi có bây giờ, không hoạt động:

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
Có vẻ như bạn muốn nhập cast ndưới dạng một số nguyên, không phải là một danh sách. Tôi bối rối.
mVChr

2
Vâng, vấn đề thực sự ở đây là sử dụng nthay vì namstrong ifs
Wooble

Trong trường hợp của bạn n không phải là một danh sách. Trước tiên hãy kiểm tra (bỏ) nó thành một số nguyên, sau đó bạn có thể lặp lại hoặc liệt kê tùy thuộc vào hiệu ứng bạn muốn đạt được.
laidback

Đúng, lầm tưởng. Đã sửa thành tên []
user1569317

"thực tế là tôi có phụ nếu báo cáo về len (my_list)." Bạn đã nghĩ về những gì được ngụ ý về các chỉ số danh sách tồn tại, bởi thực tế là lendanh sách ít nhất là một giá trị nhất định?
Karl Knechtel

Câu trả lời:


157

Nó có thể hữu ích hơn cho bạn để sử dụng độ dài của danh sách len(n)để thông báo quyết định của bạn thay vì kiểm tra n[i]từng độ dài có thể?


6
Vâng. Khi xem xét mã, thiết lập của tôi hoàn toàn không cần thiết; len (n) hoàn thành mọi thứ tôi cần. Cảm ơn cho một điểm đi đúng hướng.
dùng1569317

1
Điều này không giải thích cho các chỉ số tiêu cực. Cách tốt nhất mà tôi biết là thử / ngoại trừ IndexError, nhưng thật tuyệt khi có một cách ngắn gọn để có được một bool
Abram

Trong các chỉ mục phủ định của Python trong danh sách, chỉ cần đếm ngược từ cuối danh sách. Vì vậy, họ không thể tồn tại theo cách tác động đến độ dài của danh sách.
JonathanV

84

Tôi cần mã để nếu một chỉ mục danh sách nhất định tồn tại, sau đó chạy một hàm.

Đây là cách sử dụng hoàn hảo cho một khối thử :

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

Tuy nhiên, theo định nghĩa, tất cả các mục trong danh sách Python nằm giữa 0len(the_list)-1tồn tại (nghĩa là không cần thử, ngoại trừ nếu bạn biết 0 <= index < len(the_list)).

Bạn có thể dùng phép liệt kê nếu bạn muốn các chỉ mục từ 0 đến phần tử cuối cùng:

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

Nếu bạn đang tìm kiếm một số suy nghĩ 'chỉ số' được xác định, tôi nghĩ rằng bạn đang hỏi sai câu hỏi. Có lẽ bạn nên cân nhắc sử dụng bộ chứa ánh xạ (chẳng hạn như dict) so với bộ chứa thứ tự (chẳng hạn như danh sách). Bạn có thể viết lại mã của bạn như thế này:

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)

Chạy như thế này:

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

Bạn cũng có thể sử dụng phương thức .get thay vì thử / ngoại trừ phiên bản ngắn hơn:

>>> 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
thử khối? Tôi là người mới bắt đầu sử dụng Python nhưng điều này có vẻ như không lớn trong lập trình ... ngoại lệ cho kiểm soát luồng? Ngoại lệ nên dành cho những thứ chúng ta không thể kiểm soát phải không?
Luis

3
@Luis Tôi cũng là người mới bắt đầu sử dụng Python, nhưng từ những gì tôi đã đọc xử lý ngoại lệ trong các trường hợp này là phong cách Python quảng bá mà C / Java / C # không có. Xem stackoverflow.com/questions/11360858/ từ
Tinister

Câu 'tất cả các chỉ số trong danh sách Python nằm trong khoảng từ 0 đến len (danh sách)' là hoàn toàn sai. Giả sử có một danh sách x = [1, 2, 3] mà len_x = 3. Không có chỉ mục nào như 3. Câu nên có: 'tất cả các chỉ số trong danh sách Python nằm giữa 0 và len (danh sách) - 1' .
Lior Magen

9
@LiorMagen: Bạn nói đúng và tôi đã chỉnh sửa nó. Đó là một điều khó khăn để bỏ phiếu một bài viết khá phổ biến cho một lỗi phạm vi như vậy. Một nhận xét đơn giản sẽ đủ.
dawg

Tôi sẽ chỉ ra rằng việc dán những thứ bên trong trysẽ không cho bạn biết nếu chỉ mục tồn tại nếu nó có thể tải được - hãy thực hiện -1- chỉ mục đó không thực sự tồn tại nhưng giá trị sẽ được trả về.
George Mauer

17

len(nams)nên bằng với nmã của bạn. Tất cả các chỉ mục 0 <= i < n"tồn tại".


15

Nó có thể được thực hiện đơn giản bằng cách sử dụng mã sau đây:

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

6

Tôi cần mã để nếu một chỉ mục danh sách nhất định tồn tại, sau đó chạy một hàm.

Bạn đã biết cách kiểm tra điều này và trên thực tế đã thực hiện các thử nghiệm như vậy trong mã của bạn .

Các chỉ số giá trị trong một danh sách dài n0thông qua n-1bao gồm.

Do đó, một danh sách có một chỉ mục i khi và chỉ khi độ dài của danh sách ít nhất i + 1.


Đúng, tôi có các công cụ để giải quyết vấn đề của mình, chỉ là không áp dụng chúng rõ ràng. Cảm ơn cho một điểm đi đúng hướng.
dùng1569317

Cảm ơn vì điều này, đặc biệt là câu cuối cùng, đây là một thuộc tính quan trọng của danh sách Python làm cho chúng khác với các mảng JavaScript và các cấu trúc tương tự khác.
robert

6

Sử dụng độ dài của danh sách sẽ là giải pháp nhanh nhất để kiểm tra xem chỉ mục có tồn tại không:

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

Điều này cũng kiểm tra các chỉ số âm và hầu hết các loại chuỗi (Thích rangesstrs) có độ dài.

Nếu bạn cần truy cập vào mục tại chỉ mục đó sau đó, thì việc xin tha thứ sẽ dễ dàng hơn so với sự cho phép , và nó cũng nhanh hơn và nhiều Pythonic hơn. Sử dụng try: except:.

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

Điều này trái ngược với:

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

3

Nếu bạn muốn lặp lại dữ liệu diễn viên được chèn:

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

1

ok, vì vậy tôi nghĩ rằng nó thực sự có thể (vì lý do tranh luận):

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

mặc dù điều này thậm chí còn đơn giản hơn:3 in range(len(your_list)
avloss

1
hoặc thậm chí điều này 3 in xrange(len(your_list)- có lẽ không thể làm tốt hơn thế này
avloss

1

Bạn có thể thử một cái gì đó như thế này

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

Lót:

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

Ví dụ đầy đủ:

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

Chỉ để biết thêm thông tin thôi. Imho, try ... except IndexErrorlà giải pháp tốt hơn.


-3

Đừng để bất kỳ khoảng trống nào trước dấu ngoặc của bạn.

Thí dụ:

n = input ()
         ^

Mẹo: Bạn nên thêm nhận xét qua và / hoặc dưới mã của bạn. Không phải đằng sau mã của bạn.


Chúc một ngày tốt lành.


Chào mừng đến với SO! Câu trả lời của bạn trông giống như một bình luận hơn là một câu trả lời. Một khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào. Ngoài ra kiểm tra điều này những gì tôi có thể làm thay thế . Nếu bạn có ý định trả lời, hãy đọc cách trả lời này để làm theo hướng dẫn của SO.
thewaywewere

-3

Rất nhiều câu trả lời, không phải là đơn giản.

Để kiểm tra xem chỉ số 'id' có tồn tại trong từ điển không:

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

if 'age' in dic

trả về đúng nếu 'tuổi' tồn tại.


1
Không phải là một câu trả lời tốt cho câu hỏi. Câu hỏi là về danh sách, không phải từ điển. Những gì bạn đề xuất không thể được thực hiện trong các trường hợp như thế này: ["joao", 39]
Ruhrpottpatriot
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.