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[]
Trong bài viết này, chúng tôi sẽ thảo luận về các cách khác nhau để kiểm tra xem giá trị có tồn tại trong từ điển hay không. Chúng tôi sẽ bao gồm các cách sau, Sử dụng danh sách hiểu, lặp qua một chuỗi của tất cả các cặp giá trị khóa trong từ điển và tạo một danh sách bool. Danh sách sẽ chứa một sự thật cho mỗi lần xuất hiện giá trị của chúng tôi trong từ điển. Sau đó gọi bất kỳ [] chức năng nào trong danh sách các bools để kiểm tra xem nó có chứa bất kỳ đúng nào không. Nếu có thì điều đó có nghĩa là giá trị của chúng tôi tồn tại trong bất kỳ cặp giá trị khóa nào của từ điển. Ở đây, giá trị 43 tồn tại trong từ điển do đó bất kỳ [] đã trả về đúng. Giá trị [] làm gì trong Python?# Dictionary of string and int
word_freq = {
"Hello": 56,
"at": 23,
"test": 43,
"this": 78
}
Vì vậy, đây là những cách khác nhau để kiểm tra xem một giá trị có tồn tại trong từ điển hay không.
Phương thức từ điển python [] Phương thức Giá trị [] Phương thức trả về đối tượng Chế độ xem. Đối tượng xem chứa các giá trị của từ điển, như một danh sách.
value = 43 # python check if value exist in dict using "in" & values[] if value in word_freq.values[]: print[f"Yes, Value: '{value}' exists in dictionary"] else: print[f"No, Value: '{value}' does not exists in dictionary"]
Output:
Yes, Value: '43' exists in dictionary
Làm thế nào để bạn kiểm tra xem một giá trị có ở trong một python chính không?
Kiểm tra xem khóa có tồn tại bằng phương thức has_key [] bằng phương thức has_key [] trả về đúng không nếu một khóa nhất định có sẵn trong từ điển, nếu không, nó sẽ trả về sai. Với phương thức sẵn có has_key [], hãy sử dụng câu lệnh IF để kiểm tra xem khóa có có trong từ điển hay không.
value = 51 # python check if value exist in dict using "in" & values[] if value in word_freq.values[]: print[f"Yes, Value: '{value}' exists in dictionary"] else: print[f"No, Value: '{value}' does not exists in dictionary"]
Output:
No, Value: '51' does not exists in dictionary
Ở đây, giá trị 51 không tồn tại trong từ điển của chúng tôi do đó nếu câu lệnh được đánh giá là sai.
Những bài viết liên quan:
- Nhận khóa liên kết với một giá trị trong một từ điển.
- Python: Kiểm tra xem chính có tồn tại theo từ điển không [6 cách]
Kiểm tra xem một giá trị có tồn tại trong từ điển Python sử dụng cho vòng lặp không
Chúng ta có thể lặp lại tất cả các cặp từ điển giá trị khóa bằng cách sử dụng vòng lặp và trong khi lặp lại, chúng ta có thể kiểm tra xem giá trị của chúng ta có khớp với bất kỳ giá trị nào trong các cặp giá trị khóa không. Chúng tôi đã tạo ra một chức năng riêng cho việc này. Hãy để hiểu điều này với một ví dụ,
def check_value_exist[test_dict, value]: do_exist = False for key, val in test_dict.items[]: if val == value: do_exist = True return do_exist value = 43 # Iterate over all key, value pairs in dict and check if value exist if check_value_exist[word_freq, value]: print[f"Yes, Value: '{value}' exists in dictionary"] else: print[f"No, Value: '{value}' does not exists in dictionary"]
Output:
Yes, Value: '43' exists in dictionary
Vì giá trị 43 tồn tại trong từ điển của chúng tôi, do đó Check_value_exist [] đã trả về đúng.
Kiểm tra xem giá trị có tồn tại trong từ điển bằng cách sử dụng bất kỳ [] và danh sách hiểu không
Sử dụng danh sách hiểu, lặp qua một chuỗi của tất cả các cặp giá trị khóa trong từ điển và tạo một danh sách bool. Danh sách sẽ chứa một sự thật cho mỗi lần xuất hiện giá trị của chúng tôi trong từ điển. Sau đó gọi bất kỳ [] chức năng nào trong danh sách các bools để kiểm tra xem nó có chứa bất kỳ đúng nào không. Nếu có thì điều đó có nghĩa là giá trị của chúng tôi tồn tại trong bất kỳ cặp giá trị khóa nào của từ điển.
# Check if key exist in dictionary using any[] if any[[True for k,v in word_freq.items[] if v == value]]: print[f"Yes, Value: '{value}' exists in dictionary"] else: print[f"No, Value: '{value}' does not exists in dictionary"]
Output:
Yes, Value: '43' exists in dictionary
Ở đây, giá trị 43 tồn tại trong từ điển do đó bất kỳ [] đã trả về đúng.
Conclusion:
Vì vậy, đây là những cách khác nhau để kiểm tra xem một giá trị có tồn tại trong từ điển hay không.