2009-03-03 59 views

Trả lời

36

Cách tốt nhất có thể là sử dụng phương pháp danh sách .index.

Đối với các đối tượng trong danh sách, bạn có thể làm một cái gì đó như:

def __eq__(self, other): 
    return self.Value == other.Value 

với bất kỳ chế biến đặc biệt mà bạn cần.

Bạn cũng có thể sử dụng một cho/trong bản Tuyên Bố với enumerate (arr)

Ví dụ về việc tìm kiếm các chỉ số của mặt hàng mà có giá trị> 100.

for index, item in enumerate(arr): 
    if item > 100: 
     return index, item 

Source

8

Có phương pháp index, i = array.index(value), nhưng tôi không nghĩ bạn có thể chỉ định toán tử so sánh tùy chỉnh. Sẽ không khó để viết chức năng của riêng bạn để làm như vậy, mặc dù:

def custom_index(array, compare_function): 
    for i, v in enumerate(array): 
     if compare_function(v): 
      return i 
204

Từ Dive Into Python :

>>> li 
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements'] 
>>> li.index("example") 
5 
+1

Cảm ơn bạn, đây là chính xác những gì tôi đang tìm kiếm, và nó làm việc một cách hoàn hảo! –

+12

Nhưng mã này đưa ra lỗi khi phần tử không có trong danh sách.Trong ngữ cảnh ví dụ hiện tại nếu tôi tìm kiếm 'ba' (nghĩa là: li.index ('ba')) cho lỗi. –

+3

Bạn có thể phát hiện lỗi khi phát hiện thấy nội dung nào đó không có trong danh sách. 'try: li.index (" ba ") ngoại trừ ValueError: found = false' –

6

Phương pháp chỉ mục của li st sẽ làm điều này cho bạn. Nếu bạn muốn đảm bảo đơn đặt hàng, hãy sắp xếp danh sách trước tiên bằng cách sử dụng sorted(). Sắp xếp chấp nhận một CMP hoặc thông số quan trọng để ra lệnh như thế nào phân loại sẽ xảy ra:

a = [5, 4, 3] 
print sorted(a).index(5) 

Hoặc:

a = ['one', 'aardvark', 'a'] 
print sorted(a, key=len).index('a') 
1

cách là một trong những điều này?

def global_index(lst, test): 
    return (pair[0] for pair in zip(range(len(lst)), lst) if test(pair[1])) 

Cách sử dụng:

>>> global_index([1, 2, 3, 4, 5, 6], lambda x: x>3) 
<generator object <genexpr> at ...> 
>>> list(_) 
[3, 4, 5] 
+3

Nhận pythonic: def global_index (lst, test): return (idx cho idx, val trong liệt kê (lst) nếu test (val)) – recursive

+5

bộ lọc (lambda x: x> 3, [1,2,3,4,5,6]) –

20

Đây là một cách khác để sử dụng danh sách hiểu (một số người có thể tìm thấy nó gây tranh cãi). Nó rất dễ tiếp cận đối với các thử nghiệm đơn giản, ví dụ: so sánh về các thuộc tính đối tượng (mà tôi cần rất nhiều):

el = [x for x in mylist if x.attr == "foo"][0] 

Tất nhiên điều này giả định sự tồn tại (và, thực sự, duy nhất) của một phần tử phù hợp trong danh sách.

+4

'el = [x cho x trong danh sách của tôi nếu x.attr ==" foo "]' 'nếu el : làm điều gì đó với el [0] ' giải quyết vấn đề" tồn tại " – berkus

12

giả sử bạn muốn tìm một giá trị trong một mảng NumPy, Tôi đoán một cái gì đó như thế này có thể làm việc:

Numpy.where(arr=="value")[0] 
115

Nếu bạn chỉ muốn tìm hiểu xem một phần tử được chứa trong danh sách hay không:

>>> li 
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements'] 
>>> 'example' in li 
True 
>>> 'damn' in li 
False 
+3

bạn trả lời là tốt nhất! =) – holms

3

Tôi tìm thấy điều này bằng cách điều chỉnh một số tutos.Nhờ google, và tất cả các bạn;)

def findall(L, test): 
    i=0 
    indices = [] 
    while(True): 
     try: 
      # next value in list passing the test 
      nextvalue = filter(test, L[i:])[0] 

      # add index of this value in the index list, 
      # by searching the value in L[i:] 
      indices.append(L.index(nextvalue, i)) 

      # iterate i, that is the next index from where to search 
      i=indices[-1]+1 
     #when there is no further "good value", filter returns [], 
     # hence there is an out of range exeption 
     except IndexError: 
      return indices 

Một sử dụng rất đơn giản:

a = [0,0,2,1] 
ind = findall(a, lambda x:x>0)) 

[2, 3] 

T.B. Scuse tiếng anh của tôi

6

tôi sử dụng chức năng trả lại chỉ số cho các phần tử phù hợp (Python 2.6):

def index(l, f): 
    return next((i for i in xrange(len(l)) if f(l[i])), None) 

Sau đó sử dụng nó thông qua chức năng lambda để lấy yếu tố cần thiết cho bất kỳ phương trình cần thiết ví dụ bằng cách sử dụng tên phần tử.

element = mylist[index(mylist, lambda item: item["name"] == "my name")] 

Nếu tôi cần sử dụng nó ở một số nơi trong mã của tôi, tôi chỉ cần xác định hàm tìm kiếm cụ thể, ví dụ: cho việc tìm kiếm yếu tố theo tên:

def find_name(l, name): 
    return l[index(l, lambda item: item["name"] == name)] 

Và sau đó nó là khá dễ dàng và có thể đọc được:

element = find_name(mylist,"my name") 
Các vấn đề liên quan