Câu hỏi ban đầu là:
Cách nhanh nhất để biết nếu một giá trị tồn tại trong một danh sách [một danh sách có hàng triệu giá trị trong đó] và chỉ số của nó là gì?
Do đó, có hai điều cần tìm:
- là một mục trong danh sách, và
- Chỉ mục là gì [nếu trong danh sách].
Hướng tới điều này, tôi đã sửa đổi mã @xslittlegrass để tính toán các chỉ mục trong mọi trường hợp và thêm một phương thức bổ sung.
Kết quả
Phương pháp là:
- trong-về cơ bản nếu x in b: return b.index [x]
- Hãy thử-hãy thử/bắt trên B.index [x] [bỏ qua phải kiểm tra xem x trong b]
- Đặt-về cơ bản nếu x trong set [b]: return b.index [x]
- Bisect-phân loại B với chỉ số của nó, tìm kiếm nhị phân cho X được sắp xếp [b]. Lưu ý mod từ @xslittlegrass, người trả về chỉ mục trong B được sắp xếp, thay vì ban đầu b]
- đảo ngược-từ điển tra cứu ngược d cho b; sau đó d [x] cung cấp chỉ số của x.
Kết quả cho thấy phương pháp 5 là nhanh nhất.
Điều thú vị là thử và các phương thức đã đặt tương đương với thời gian.try and the set methods are equivalent in time.
Mã kiểm tra
import random
import bisect
import matplotlib.pyplot as plt
import math
import timeit
import itertools
def wrapper[func, *args, **kwargs]:
" Use to produced 0 argument function for call it"
# Reference //www.pythoncentral.io/time-a-python-function/
def wrapped[]:
return func[*args, **kwargs]
return wrapped
def method_in[a,b,c]:
for i,x in enumerate[a]:
if x in b:
c[i] = b.index[x]
else:
c[i] = -1
return c
def method_try[a,b,c]:
for i, x in enumerate[a]:
try:
c[i] = b.index[x]
except ValueError:
c[i] = -1
def method_set_in[a,b,c]:
s = set[b]
for i,x in enumerate[a]:
if x in s:
c[i] = b.index[x]
else:
c[i] = -1
return c
def method_bisect[a,b,c]:
" Finds indexes using bisection "
# Create a sorted b with its index
bsorted = sorted[[[x, i] for i, x in enumerate[b]], key = lambda t: t[0]]
for i,x in enumerate[a]:
index = bisect.bisect_left[bsorted,[x, ]]
c[i] = -1
if index < len[a]:
if x == bsorted[index][0]:
c[i] = bsorted[index][1] # index in the b array
return c
def method_reverse_lookup[a, b, c]:
reverse_lookup = {x:i for i, x in enumerate[b]}
for i, x in enumerate[a]:
c[i] = reverse_lookup.get[x, -1]
return c
def profile[]:
Nls = [x for x in range[1000,20000,1000]]
number_iterations = 10
methods = [method_in, method_try, method_set_in, method_bisect, method_reverse_lookup]
time_methods = [[] for _ in range[len[methods]]]
for N in Nls:
a = [x for x in range[0,N]]
random.shuffle[a]
b = [x for x in range[0,N]]
random.shuffle[b]
c = [0 for x in range[0,N]]
for i, func in enumerate[methods]:
wrapped = wrapper[func, a, b, c]
time_methods[i].append[math.log[timeit.timeit[wrapped, number=number_iterations]]]
markers = itertools.cycle[['o', '+', '.', '>', '2']]
colors = itertools.cycle[['r', 'b', 'g', 'y', 'c']]
labels = itertools.cycle[['in', 'try', 'set', 'bisect', 'reverse']]
for i in range[len[time_methods]]:
plt.plot[Nls,time_methods[i],marker = next[markers],color=next[colors],linestyle='-',label=next[labels]]
plt.xlabel['list size', fontsize=18]
plt.ylabel['log[time]', fontsize=18]
plt.legend[loc = 'upper left']
plt.show[]
profile[]
Giới thiệu
Trong hướng dẫn này, chúng ta sẽ xem cách kiểm tra xem danh sách có chứa phần tử hoặc giá trị trong Python không. Chúng tôi sẽ sử dụng một danh sách các chuỗi, chứa một vài động vật:
animals = ['Dog', 'Cat', 'Bird', 'Fish']
Kiểm tra xem danh sách có chứa phần tử với vòng lặp không
Một phương pháp đơn giản và thô sơ để kiểm tra xem danh sách có chứa một phần tử đang lặp qua nó không và kiểm tra xem mục chúng tôi có phù hợp với phần chúng tôi đang tìm kiếm không. Hãy sử dụng vòng lặp
animals = ['Dog', 'Cat', 'Bird', 'Fish']
8 cho việc này:for animal in animals:
if animal == 'Bird':
print['Chirp!']
Mã này sẽ dẫn đến:
Chirp!
Kiểm tra xem danh sách có chứa phần tử với toán tử không
Bây giờ, một cách tiếp cận Succint hơn sẽ là sử dụng toán tử
animals = ['Dog', 'Cat', 'Bird', 'Fish']
9 tích hợp, nhưng với câu lệnh for animal in animals:
if animal == 'Bird':
print['Chirp!']
0 thay vì câu lệnh animals = ['Dog', 'Cat', 'Bird', 'Fish']
8. Khi được ghép nối với for animal in animals:
if animal == 'Bird':
print['Chirp!']
0, nó sẽ trả về for animal in animals:
if animal == 'Bird':
print['Chirp!']
3 nếu một phần tử tồn tại theo một chuỗi hay không. Cú pháp của toán tử animals = ['Dog', 'Cat', 'Bird', 'Fish']
9 trông như thế này:element in list
Sử dụng toán tử này, chúng tôi có thể rút ngắn mã trước đó thành một câu lệnh:
if 'Bird' in animals: print['Chirp']
Đoạn mã này sẽ xuất ra như sau:
Chirp
Cách tiếp cận này có hiệu quả tương tự như vòng lặp
animals = ['Dog', 'Cat', 'Bird', 'Fish']
8, vì toán tử animals = ['Dog', 'Cat', 'Bird', 'Fish']
9, được sử dụng như thế này, gọi hàm for animal in animals:
if animal == 'Bird':
print['Chirp!']
7, vốn đã lặp qua danh sách - mặc dù, nó dễ đọc hơn nhiều.Kiểm tra xem danh sách có chứa phần tử không có trong toán tử không
Ngược lại, chúng ta có thể sử dụng toán tử
for animal in animals:
if animal == 'Bird':
print['Chirp!']
8, là đối diện logic của toán tử animals = ['Dog', 'Cat', 'Bird', 'Fish']
9. Nó trả về for animal in animals:
if animal == 'Bird':
print['Chirp!']
3 nếu phần tử không có mặt trong một chuỗi.Hãy viết lại ví dụ về mã trước để sử dụng toán tử
for animal in animals:
if animal == 'Bird':
print['Chirp!']
8:if 'Bird' not in animals: print['Chirp']
Chạy mã này sẽ không tạo ra bất cứ điều gì, vì
Chirp!
2 có trong danh sách của chúng tôi.Nhưng nếu chúng ta dùng thử với
Chirp!
3:if 'Wolf' not in animals: print['Howl']
Mã này dẫn đến:
Howl
Kiểm tra xem danh sách có chứa phần tử với Lambda không
Một cách khác, bạn có thể kiểm tra xem một phần tử có mặt không phải là lọc mọi thứ khác ngoài phần tử đó, giống như sàng lọc qua cát và kiểm tra xem cuối cùng có bất kỳ vỏ nào không. Phương pháp
Chirp!
4 tích hợp chấp nhận hàm Lambda và danh sách là đối số của nó. Chúng tôi có thể sử dụng chức năng Lambda ở đây để kiểm tra chuỗi Chirp!
5 của chúng tôi trong danh sách Chirp!
6.Sau đó, chúng tôi kết thúc kết quả trong một
Chirp!
7 vì phương thức Chirp!
4 trả về một đối tượng Chirp!
9, không phải là kết quả. Nếu chúng ta đóng gói đối tượng Chirp!
9 trong danh sách, nó sẽ chứa các phần tử còn lại sau khi lọc:animals = ['Dog', 'Cat', 'Bird', 'Fish']
0Mã này dẫn đến:
Kiểm tra hướng dẫn thực hành của chúng tôi, thực tế để học Git, với các thực hành tốt nhất, các tiêu chuẩn được công nghiệp chấp nhận và bao gồm bảng gian lận. Ngừng các lệnh git googling và thực sự tìm hiểu nó!
animals = ['Dog', 'Cat', 'Bird', 'Fish']
1Bây giờ, cách tiếp cận này không phải là hiệu quả nhất. Nó khá chậm hơn ba cách tiếp cận trước đó chúng tôi đã sử dụng. Phương thức
Chirp!
4 tự nó tương đương với hàm máy phát:animals = ['Dog', 'Cat', 'Bird', 'Fish']
2Hiệu suất bị chậm lại của mã này, trong số những thứ khác, xuất phát từ thực tế là chúng ta đang chuyển đổi kết quả thành một danh sách cuối cùng, cũng như thực hiện một hàm trên mục trên mỗi lần lặp.
Kiểm tra xem danh sách có chứa phần tử bằng bất kỳ []
Một cách tiếp cận tích hợp tuyệt vời khác là sử dụng hàm
element in list
2, đây chỉ là hàm trợ giúp kiểm tra xem có [ít nhất 1] trường hợp của một phần tử trong danh sách không. Nó trả về for animal in animals:
if animal == 'Bird':
print['Chirp!']
3 hoặc element in list
4 dựa trên sự hiện diện hoặc thiếu của một yếu tố:animals = ['Dog', 'Cat', 'Bird', 'Fish']
3Vì điều này dẫn đến
for animal in animals:
if animal == 'Bird':
print['Chirp!']
3, tuyên bố element in list
6 của chúng tôi được gọi là:Chirp
Cách tiếp cận này cũng là một cách hiệu quả để kiểm tra sự hiện diện của một yếu tố. Nó hiệu quả như ba đầu tiên.
Kiểm tra xem danh sách có chứa phần tử bằng cách sử dụng Count []
Cuối cùng, chúng ta có thể sử dụng chức năng
element in list
7 để kiểm tra xem phần tử có mặt hay không:animals = ['Dog', 'Cat', 'Bird', 'Fish']
5Hàm này trả về sự xuất hiện của phần tử đã cho trong một chuỗi. Nếu nó lớn hơn 0, chúng ta có thể đảm bảo một mục đã cho nằm trong danh sách.
Hãy kiểm tra kết quả của hàm
element in list
7:animals = ['Dog', 'Cat', 'Bird', 'Fish']
6Hàm
element in list
7 vốn đã lặp lại danh sách để kiểm tra số lượng xảy ra và mã này dẫn đến:Chirp
Sự kết luận
Trong hướng dẫn này, chúng tôi đã đi qua một số cách để kiểm tra xem một yếu tố có mặt trong danh sách hay không. Chúng tôi đã sử dụng các toán tử
animals = ['Dog', 'Cat', 'Bird', 'Fish']
8, animals = ['Dog', 'Cat', 'Bird', 'Fish']
9 và for animal in animals:
if animal == 'Bird':
print['Chirp!']
8, cũng như các phương thức Chirp!
4, element in list
2 và element in list
7.