Tra cứu từ điển Python là gì?

Phương thức từ điển Python get[] trả về một giá trị cho khóa đã cho. Nếu không có khóa thì trả về giá trị mặc định Không có

cú pháp

Sau đây là cú pháp của phương thức get[] −

dict.get[key, default = None]

Thông số

  • key - Đây là Key được tìm kiếm trong từ điển

  • mặc định - Đây là Giá trị được trả về trong trường hợp khóa không tồn tại

Giá trị trả về

Phương thức này trả về một giá trị cho khóa đã cho. Nếu không có khóa thì trả về giá trị mặc định Không có

Chào mừng bạn đến với một hướng dẫn Python khác. Hôm nay, chúng ta sẽ xem xét các từ điển và cách chúng ta có thể thực hiện tra cứu từ điển ngược. Nói cách khác, làm thế nào để chúng ta lấy một khóa từ một từ điển được cung cấp một giá trị?

Hóa ra, có ba giải pháp chính. Đầu tiên, chúng ta có thể thử lặp lại từ điển một cách rõ ràng bằng cách sử dụng thứ gì đó như `my_dict. items[]`python. Ngoài ra, chúng ta có thể tạo một biểu thức trình tạo. `next[key cho key, value trong my_dict. items[] if value == value_to_find]`python. Cuối cùng, chúng ta có thể đảo ngược hoàn toàn từ điển để lấy khóa như bình thường

Mục lục

Giới thiệu vấn đề

Trước đây, tôi đã viết một bài viết về cách đảo ngược từ điển. Nói cách khác, làm cách nào để hoán đổi khóa và giá trị trong từ điển? . Tất cả những gì chúng ta cần là một khóa được cung cấp một giá trị

Thông thường khi chúng ta sử dụng một từ điển, chúng ta sẽ truyền cho nó một khóa để lấy một giá trị. Nhưng, nếu chúng ta muốn truy xuất một khóa đã cho một giá trị thì sao? . Ví dụ: với từ điển sau, chúng tôi có thể muốn truy xuất khóa đầu tiên khớp với giá trị “đỏ”

my_dict = {
  "color": "red", 
  "width": 17, 
  "height": 19
}

Trong trường hợp này, chúng tôi mong muốn giải pháp của mình trả về “màu”. Tất nhiên, có thể có nhiều khóa phù hợp. Làm thế nào để chúng tôi quyết định cái nào để lấy?

May mắn thay, chúng ta sẽ không đi sâu vào sắc thái trong bài viết này. Thay vào đó, chúng tôi sẽ xem xét một số giải pháp trả về khóa đầu tiên hoặc mọi khóa khớp với giá trị

Các giải pháp

Trong bài viết này, chúng ta sẽ xem xét một số cách để thực hiện tra cứu ngược truyền thống. Như mọi khi, chúng tôi sẽ bắt đầu mọi thứ bằng một giải pháp bạo lực. Sau đó, chúng ta sẽ xem xét một số giải pháp phức tạp hơn

Tra cứu từ điển ngược bằng Brute Force

Có lẽ một cách đơn giản để giải quyết vấn đề này là lặp lại từ điển cho đến khi chúng tôi tìm thấy giá trị mà chúng tôi đang tìm kiếm

my_dict = {"color": "red", "width": 17, "height": 19}
value_to_find = "red"
for key, value in my_dict.items[]:
    if value == value_to_find:
        print[f'{key}: {value}']

Trong trường hợp này, chúng tôi đang tra cứu từ điển cho giá trị “đỏ”. Trong mỗi lần lặp lại, chúng tôi sẽ kiểm tra xem giá trị mà chúng tôi đang tìm kiếm có khớp với giá trị hiện tại không. Nếu có, chúng tôi in kết quả

Nếu chúng tôi sao chép nguyên văn giải pháp này, nó sẽ thực sự nhổ ra tất cả các khóa phù hợp. Trong trường hợp này, chúng ta sẽ chỉ thấy “màu. màu đỏ". Điều đó nói rằng, một từ điển lớn hơn có thể tạo ra các bản sao

Bằng mọi giá, có rất nhiều giải pháp thú vị hơn ở phía trước

Tra cứu từ điển đảo ngược bằng biểu thức trình tạo

Thay vì lặp lại từ điển của chúng tôi một cách rõ ràng, chúng tôi có thể tận dụng một biểu thức trình tạo [PEP 289

] trông giống như một cách hiểu danh sách.

my_dict = {"color": "red", "width": 17, "height": 19}
value_to_find = "red"
key = next[key for key, value in my_dict.items[] if value == value_to_find]
print[f'{key}: {value_to_find}']

Đương nhiên, sự khác biệt giữa cách hiểu danh sách và biểu thức trình tạo là không có danh sách nào được tạo. Nói cách khác, chúng tôi tiết kiệm bộ nhớ và có thể cả thời gian

Trong ví dụ trên, thay vì tạo danh sách tất cả các cặp khóa-giá trị và lặp lại chúng, chúng tôi liên tục tạo một cặp khóa-giá trị mới cho đến khi chúng tôi tìm thấy một cặp phù hợp. Đoạn mã thông minh này về cơ bản là phiên bản rút gọn của vòng lặp từ giải pháp cưỡng bức thô bạo của chúng tôi. Tất nhiên, quá trình lặp lại dừng lại khi chúng tôi tìm thấy thứ chúng tôi cần

Xin lưu ý rằng giải pháp này sẽ chỉ trả về khóa đầu tiên khớp với giá trị tra cứu của chúng tôi. Nếu chúng tôi muốn có nhiều hơn một khóa, chúng tôi phải lưu trữ biểu thức trình tạo

exp = [key for key, value in my_dict.items[] if value == value_to_find]
next[exp] # First matching key
next[exp] # Second matching key

Nếu chúng ta gọi `next`python nhiều hơn số lần khớp, chúng ta sẽ gặp lỗi `StopIteration`python. Như một giải pháp thay thế, chúng ta có thể sử dụng trực tiếp vòng lặp for-each

exp = [key for key, value in my_dict.items[] if value == value_to_find]
for key in exp:
    print[key]

Bây giờ, không phải là tốt đẹp?

Tra cứu từ điển đảo ngược bằng cách sử dụng từ điển đảo ngược

Như tôi đã đề cập trong phần mô tả vấn đề, chúng ta luôn có thể lật ngược từ điển hoàn toàn

my_dict = {"color": "red", "width": 17, "height": 19}
value_to_find = "red"
my_inverted_dict = {value: key for key, value in my_dict.items[]}
key = my_inverted_dict[value_to_find]

Nếu bạn chưa có cơ hội đọc bài viết khác, về cơ bản, giải pháp này tận dụng khả năng hiểu từ điển. Nói cách khác, nó xây dựng một từ điển mới từ từ điển gốc. Đương nhiên, phần thực hiện phép thuật là `giá trị. key`python đảo ngược ánh xạ

Thật không may, giải pháp này sẽ không hoạt động trong mọi trường hợp vì không phải tất cả các giá trị đều có thể băm được [e. g. danh sách], nhưng nó hoàn thành công việc. Tương tự như vậy, nó chỉ lưu khóa cuối cùng cho bất kỳ giá trị trùng lặp nào. Do đó, các khóa có thể khác bị mất

Nếu chúng tôi muốn một giải pháp tạo danh sách các khóa, chúng tôi có thể làm điều gì đó như sau

my_dict = {"color": "red", "width": 17, "height": 19}
value_to_find = "red"
my_inverted_dict = dict[]
for key, value in my_dict.items[]:
    my_inverted_dict.setdefault[value, list[]].append[key]
keys = my_inverted_dict[value_to_find]

Trong ví dụ này, chúng tôi kết thúc bằng một danh sách các khóa thay vì một khóa duy nhất

Hiệu suất

Như mọi khi, chúng ta hãy xem hiệu suất của từng giải pháp này. Trước tiên, chúng ta sẽ cần thiết lập chúng theo chuỗi

________số 8

Để hoàn thiện, tôi đã điều chỉnh từng giải pháp cho từng tình huống có thể xảy ra. Hoặc chúng tôi muốn một khóa duy nhất hoặc chúng tôi muốn nhiều khóa. Do đó, mỗi bài kiểm tra được dán nhãn đơn hoặc đa tương ứng

Về mặt thử nghiệm, đây là kết quả

>>> import timeit
>>> min[timeit.repeat[setup=setup, stmt=brute_force_single]]
0.19409550000000309
>>> min[timeit.repeat[setup=setup, stmt=brute_force_multi]]
0.3046430999997938
>>> min[timeit.repeat[setup=setup, stmt=generator_single]]
0.6223289999998087
>>> min[timeit.repeat[setup=setup, stmt=generator_multi]]
0.6531434000003173
>>> min[timeit.repeat[setup=setup, stmt=inverse_single]]
0.5350638999998409
>>> min[timeit.repeat[setup=setup, stmt=inverse_multi]]
1.2309030999999777

Thật kỳ lạ, giải pháp biểu thức trình tạo thực sự khá chậm. Có lẽ, có một chút chi phí khi tạo biểu thức trình tạo. Tôi muốn xem giải pháp này mở rộng như thế nào với các từ điển lớn hơn, vì vậy tôi đã cập nhật chuỗi thiết lập và chạy lại các thử nghiệm của mình

my_dict = {
  "color": "red", 
  "width": 17, 
  "height": 19
}
0

Một lần nữa, tôi hơi phiền với kết quả, vì vậy tôi đã thử thay đổi giá trị mà chúng tôi đang tìm kiếm

my_dict = {"color": "red", "width": 17, "height": 19}
value_to_find = "red"
for key, value in my_dict.items[]:
    if value == value_to_find:
        print[f'{key}: {value}']
0

Một lần nữa, vũ phu có hiệu suất tốt nhất. Khi tôi tìm hiểu lý do tại sao, tôi thấy rằng có một chút chi phí như tôi nghi ngờ. Nếu có thời gian, có lẽ tôi sẽ chạy từng giải pháp này thông qua `cProfiler`python như đã nêu trong bài viết về hiệu suất của tôi. Điều đó nói rằng, tôi sẽ trì hoãn các câu trả lời trong chuỗi Stack Overflow này

.

Nhìn chung, có vẻ như mỗi giải pháp đều hoạt động theo thứ tự chúng được trình bày. Nói cách khác, brute force nhanh hơn một chút so với biểu thức trình tạo. Trong khi đó, lật từ điển có thể cực kỳ tốn kém

Thách đấu

Với tất cả những thứ thú vị đang chờ bạn, hãy xem thử thách của bạn. Kể từ khi đề cập đến tra cứu từ điển ngược, tôi nghĩ sẽ rất vui khi thử thách bạn với những điều sau đây

Xem xét cả ba giải pháp trên [hoặc 6 nếu bạn bao gồm các yêu cầu khác nhau]. Bạn có thể phân tích chính xác lý do tại sao mỗi giải pháp hoạt động theo cách của nó không?

Như tôi đã đề cập trước đây, bạn có thể sử dụng bất kỳ công cụ nào bạn có để hỗ trợ lập luận của mình. Chẳng hạn, bạn có thể thử sử dụng `cProfile`python để kiểm tra hoạt động bên trong của từng giải pháp. Tương tự như vậy, bạn có thể thử chạy các thử nghiệm khác nhau như tôi đã làm với `timeit`python. Có lẽ một biểu đồ của từng giải pháp theo khối lượng công việc khác nhau sẽ giúp bạn tìm ra thời gian chạy tiệm cận

Có thể, bạn không muốn chạy bất kỳ công cụ kiểm tra thực nghiệm nào cả. Thay vào đó, bạn muốn xem trực tiếp mã nguồn và theo dõi công việc mà nó phải làm để hoàn thành nhiệm vụ của chúng tôi. Dù bạn chọn làm gì, hãy nhớ chia sẻ kết quả của mình trên Twitter bằng cách sử dụng thẻ bắt đầu bằng # #RenegadePython

.

Trong trường hợp bạn đang thắc mắc, tôi đã bắt đầu mọi thứ bằng cách thực thi nhanh `cProfile. run[]`python trên giải pháp `brute_force_single`python của chúng tôi

Trong Cách thực hiện tra cứu từ điển ngược, tôi đã yêu cầu bạn tìm ra sự khác biệt về hiệu suất của từng giải pháp bằng cách đào sâu mã. Ở đây, tôi đã sử dụng cProfile trên giải pháp nhanh nhất. Hãy cho tôi biết nếu bạn tìm hiểu mã bằng cách sử dụng thẻ #RenegadePython

. ảnh. Twitter. com/5KdVlZS2pT

– Jeremy Grifski [@ RenegadeCoder94] Ngày 19 tháng 4 năm 2020

Tôi tự hỏi những giải pháp khác trông như thế nào dưới mui xe

Một bản tóm tắt nhỏ

Và với điều đó, chúng tôi đã hoàn thành. Đây là tất cả các giải pháp từ bài viết này ở một nơi

my_dict = {"color": "red", "width": 17, "height": 19}
value_to_find = "red"
for key, value in my_dict.items[]:
    if value == value_to_find:
        print[f'{key}: {value}']
1

Nếu bạn thích bài viết này, tôi sẽ theo dõi tất cả các đoạn mã Python của mình trong một bài viết lớn có tiêu đề Đoạn mã Python cho các vấn đề hàng ngày. Tương tự như vậy, bạn thường có thể tìm thấy mã có thể chạy được trong repo GitHub được liên kết

.

Sau tất cả những điều đó, đã đến lúc tôi cần bạn giúp một chút. Cụ thể, tôi rất vui nếu bạn vào danh sách gửi thư của tôi hoặc thậm chí trở thành người bảo trợ

. Ngoài ra, tôi đang cố gắng phát triển kênh YouTube của mình, vì vậy hãy truy cập và đăng ký
.

Nếu không, hãy xem một số tài nguyên Python này trên Amazon [quảng cáo]

  • Python hiệu quả. 90 cách cụ thể để viết Python tốt hơn
  • Thủ thuật Python. Một loạt các tính năng tuyệt vời của Python
  • Lập trình Python. Giới thiệu về Khoa học Máy tính

Nếu bạn có thời gian, tôi rất cảm kích nếu bạn chịu khó xem qua một số bài viết liên quan này

  • Rock Paper Scissors Sử dụng Số học Mô-đun
  • Cách sắp xếp danh sách từ điển trong Python
  • Tranh cãi đằng sau toán tử hải mã trong Python

Nếu không, cảm ơn vì đã ghé qua. Tôi rât cảm kich

Cách sử dụng Python [41 bài viết]—Dòng điều hướng

Loạt bài hướng dẫn Làm thế nào để Python khác với các bài viết viết mã chuyên sâu thông thường bằng cách khám phá các vấn đề có kích thước byte trong Python. Trong loạt bài này, học sinh sẽ đi sâu vào các chủ đề độc đáo như Cách đảo ngược từ điển, Cách tính tổng các phần tử của hai danh sách và Cách kiểm tra xem tệp có tồn tại không

Mỗi vấn đề được khám phá từ cách tiếp cận ngây thơ đến giải pháp lý tưởng. Thỉnh thoảng, cũng sẽ có một số giải pháp chỉ để cho vui. Ở cuối mỗi bài viết, bạn sẽ tìm thấy một bản tóm tắt đầy đủ các đoạn mã để bạn sử dụng. Đừng ngại lấy những gì bạn cần

Nếu bạn không chắc nên bắt đầu từ đâu, tôi khuyên bạn nên xem danh sách Đoạn mã Python cho các vấn đề hàng ngày của chúng tôi. Ngoài ra, bạn có thể tìm thấy một số đoạn trích ở định dạng sổ ghi chép Jupyter trên GitHub

,

Nếu bạn có một vấn đề của riêng bạn, xin vui lòng hỏi. Một người khác có thể có cùng một vấn đề. Thưởng thức cách sử dụng Python

Tra cứu trong từ điển bằng Python là gì?

Nó sẽ tìm và trả về từ điển đầu tiên chứa khóa đã cho và có thể dễ dàng sửa đổi để trả về danh sách từ điển nếu .

Tra cứu từ điển Python nhanh như thế nào?

Từ điển là 6. Nhanh hơn 6 lần so với danh sách khi chúng tôi tra cứu trong 100 mục.

Từ điển Python dùng để làm gì?

Từ điển. Từ điển được sử dụng để lưu trữ giá trị dữ liệu trong khóa. cặp giá trị . Từ điển là một bộ sưu tập được sắp xếp theo thứ tự *, có thể thay đổi và không cho phép trùng lặp. Kể từ phiên bản Python 3. 7, từ điển được đặt hàng.

Tra cứu ngược trong từ điển là gì?

Cho một từ điển d và một khóa k , thật dễ dàng tìm thấy giá trị tương ứng v = d[k] . Hoạt động này được gọi là tra cứu.

Chủ Đề