Tôi biết bạn đã hài lòng với một trong những câu trả lời trong bài viết này, nhưng bạn có thể thử với những sản phẩm sau
>>> v = [1,2,3,4,3,1,2]
def InList(v,(i,j)):
start=1
try:
while True:
if v[v.index(i,start)+1]==j and v[v.index(j,start)-1]==i:
return True
start=v.index(i)+1
except IndexError:
return False
except ValueError:
return False
>>> InList(v,(2,3))
True
>>> InList(v,(4,5))
False
>>> InList(v,(1,2))
True
>>> InList(v,(12,2))
False
>>> InList(v,(3,1))
True
Ok Curiosity trở nên tốt hơn của tôi và vì vậy muốn kiểm tra cách thực hiện điều này thực hiện thực hiện với việc thực hiện đăng tải nhanh nhất
>>> stmt1="""
v = [1,2,3,4,3,1,2]
def InList(v,(i,j)):
start=1
try:
while True:
if v[v.index(i,start)+1]==j and v[v.index(j,start)-1]==i:
return True
start=v.index(i)+1
except IndexError:
return False
except ValueError:
return False
InList(v,(2,3))
InList(v,(4,5))
InList(v,(1,2))
InList(v,(12,2))
"""
>>> stmt2="""
v = [1,2,3,4,3,1,2]
def InList(v,(x,y)):
any([x,y] == v[i:i+2] for i in xrange(len(v) - 1))
InList(v,(2,3))
InList(v,(4,5))
InList(v,(1,2))
InList(v,(12,2))
"""
>>> t1=timeit.Timer(stmt=stmt1)
>>> t2=timeit.Timer(stmt=stmt2)
>>> print "%.2f usec/pass" % (1000000 * t1.timeit(number=100000)/100000)
13.67 usec/pass
>>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=100000)/100000)
20.67 usec/pass
>>>
Gosh đây là cách nhanh
Lưu ý ** Cảm ơn Michael đã chỉ ra. Tôi đã sửa chữa nó và đây là giải pháp cập nhật của tôi.
Sẽ không có người nối tạo ra một sublist mới mỗi lần? wont 2 nếu được tốt hơn? đúng nếu tôi đã sai lầm. – st0le
Tôi tin rằng 'v [i: i + 2]' chỉ xem các phần tử của danh sách. – eumiro
@eumiro Niềm tin của bạn không chính xác :-) Danh sách lát tạo danh sách mới. Ví dụ, đó là cơ chế đằng sau thành ngữ để tạo một bản sao danh sách: '' c = s [:] ''. –