2015-04-18 17 views
17

Dường như làLàm cách nào để kiểm tra xem liệu chỉ mục danh sách có tồn tại không?

if not mylist[1]: 
    return False 

Không hoạt động.

+0

'mylist [1] 'sẽ trở lại phần tử tại chỉ số 1. Nói rằng yếu tố này là giá trị' FALSE', làm thế nào bạn sẽ xem xét nó? – alfasin

+0

Vâng, mã của tôi rất đáng sợ. Những gì tôi đã cố gắng để làm có vẻ như một cách rất unpythonic làm nó nếu nó làm việc. – Sundrah

+0

Bạn lấy giá trị '1' từ đâu? –

Trả lời

24

Bạn chỉ cần phải kiểm tra xem chỉ số bạn muốn nằm trong phạm vi của 0 và độ dài của danh sách, như thế này

if 0 <= index < len(list): 

nó thực sự là internall y được đánh giá là

if (0 <= index) and (index < len(list)): 

Vì vậy, điều kiện đó sẽ kiểm tra xem chỉ mục nằm trong phạm vi [0, độ dài danh sách) hay không.

Lưu ý: Python hỗ trợ lập chỉ mục phủ định. Trích dẫn Python documentation,

Nếu i hoặc j là tiêu cực, chỉ số này liên quan đến sự kết thúc của chuỗi: len(s) + i hoặc len(s) + j được thay thế. Nhưng lưu ý rằng -0 vẫn là 0,

Điều đó có nghĩa là bất cứ khi nào bạn sử dụng chỉ mục phủ định, giá trị sẽ được thêm vào độ dài của danh sách và kết quả sẽ được sử dụng. Vì vậy, list[-1] sẽ cung cấp cho bạn thành phần list[-1 + len(list)].

Vì vậy, nếu bạn muốn cho phép chỉ số tiêu cực, thì bạn có thể chỉ đơn giản là kiểm tra xem chỉ số không vượt quá chiều dài của danh sách, như thế này

if index < len(list): 

Một cách khác để làm điều này là , ngoại trừ IndexError, như thế này

a = [] 
try: 
    a[0] 
except IndexError: 
    return False 
return True 

Khi bạn đang cố gắng truy cập vào một phần tử ở một chỉ số không hợp lệ, một IndexError được nâng lên. Vì vậy, phương pháp này hoạt động.


Lưu ý: Phương pháp mà bạn đề cập trong câu hỏi có một vấn đề.

if not mylist[1]: 

phép nói rằng 1 là một chỉ số có giá trị trong mylist, và nếu nó trả về một Falsy value. Sau đó, not sẽ từ chối nó để điều kiện if sẽ được đánh giá là Chân thực. Vì vậy, nó sẽ trả lại False, mặc dù một phần tử thực sự có trong danh sách.

+0

Nếu chỉ số âm quá thấp, bạn sẽ nhận được 'IndexError' vì nằm ngoài phạm vi, vì vậy bạn có thể kiểm tra' index> = -len (list) 'nếu bạn đang hỗ trợ. –

+0

Một nhược điểm khác đối với phương thức đầu tiên là Python cho phép các chỉ mục không tuần tự qua .insert –

2

Trong trường hợp danh sách số nguyên-lập chỉ mục, tôi chỉ đơn giản muốn làm

if 1 < len(mylist): 
    ... 

Đối dicts, bạn có thể tất nhiên làm

if key in mydict: 
    ... 
4

Trong EAFP phong cách của Python:

try: 
    mylist[1] 
except IndexError: 
    print "Index doesn't exist!" 
Các vấn đề liên quan