2009-03-16 40 views
7

Tôi có một danh sách các số nguyên. Tôi muốn biết liệu số 13 xuất hiện trong đó và, nếu có, ở đâu. Tôi có phải tìm kiếm trong danh sách hai lần không, như trong đoạn dưới đây?Danh sách Python có tương đương với dict.get không?

if 13 in intList: 
    i = intList.index(13) 

Trong trường hợp từ điển, có chức năng get sẽ xác định tư cách thành viên và thực hiện tra cứu với cùng một tìm kiếm. Có điều gì đó tương tự cho danh sách không?

Trả lời

12

Bạn đã tự trả lời bằng phương thức index(). Đó sẽ ném một ngoại lệ nếu chỉ số không được tìm thấy, vì vậy chỉ cần bắt rằng:

def getIndexOrMinusOne(a, x): 
    try: 
    return a.index(x) 
    except ValueError: 
    return -1 
+0

Không bao giờ sử dụng mệnh đề ngoại trừ trống. Bạn nên làm ngoại trừ IndexError. –

+0

không hoạt động. [] .index() ném một ValueError – SingleNegationElimination

+0

Bạn có thể lạm dụng danh sách nếu bạn cần làm những việc theo cách này; điều này trông giống như một mùi mã. –

7

Dường như bạn sẽ chỉ phải nắm bắt những ngoại lệ ...

try: 
    i = intList.index(13) 
except ValueError: 
    i = some_default_value 
-1

Chỉ cần đặt những gì bạn có chức năng và sử dụng nó :)

Bạn có thể sử dụng if i in list: return list.index(i) hoặc try/except, tùy thuộc vào tùy chọn của bạn.

3

Không, không khớp trực tiếp với những gì bạn yêu cầu. Có a discussion a while back trên danh sách gửi thư của Python về điều này và mọi người đã đạt đến kết luận rằng đó có thể là một mùi mã nếu bạn cần điều này. Cân nhắc sử dụng dict hoặc đặt thay vào đó nếu bạn cần kiểm tra tư cách thành viên theo cách đó.

+0

Tôi nghĩ bạn không đọc kỹ câu hỏi. – vartec

+0

Ah, rất tiếc; bạn đúng. Đã sửa! –

+0

Điều này chỉ cần trích cú pháp của mẫu mã ban đầu. Vấn đề về hiệu suất không được thêm vào. Python vẫn kiểm tra nếu mục trong danh sách đầu tiên, sau đó tìm kiếm chỉ mục của mục trong danh sách. –

2

Bạn có thể bắt các ngoại lệ ValueError, hoặc bạn có thể làm:

i = intList.index(13) if 13 in intList else -1 

(Python 2.5+)

BTW. nếu bạn định thực hiện một loạt các hoạt động tương tự, bạn có thể xem xét xây dựng giá trị từ điển ngược -> chỉ mục.

intList = [13,1,2,3,13,5,13] 
indexDict = defaultdict(list) 
for value, index in zip(intList, range(len(intList))): 
    indexDict[value].append(index) 

indexDict[13] 
[0, 4, 6] 
Các vấn đề liên quan