Có thể đảo ngược từ điển trong Python không?

# Ví dụ về chương trình Python sử dụng trình vòng lặp ngược của từ điển

# Tạo một từ điển Python về các giá trị rgb

màu = {"r". 124, "g". 234, "b". 126};

# In từ điển theo thứ tự thông thường

print("Từ điển được in theo thứ tự chuyển tiếp. ");

cho c màu

in(c, màu[c]);

# In từ điển theo thứ tự ngược lại

print("Từ điển in theo thứ tự đảo ngược. ");

cho c trong đảo ngược (màu)

in(c, màu[c]);

Chào mừng bạn đến với phần đầu của loạt bài Làm thế nào để Python. Trong loạt bài này, tôi tập hợp một số bài viết về các vấn đề Python nhỏ có thể được giải quyết bằng một vài dòng mã. Loạt bài này được lấy cảm hứng từ các tìm kiếm hàng ngày trên Google mà tôi thực hiện để giải quyết các vấn đề của riêng mình tại nơi làm việc. Để bắt đầu, tôi đã quyết định bắt đầu loạt bài này bằng cách viết một bài viết về cách đảo ngược từ điển

Tóm lại, một trong những cách tốt nhất để đảo ngược từ điển trong Python là sử dụng vòng lặp for kết hợp với phương thức `setdefault`python của từ điển để lưu trữ các khóa trùng lặp trong danh sách. Nếu đó không phải là vấn đề với bạn, thì việc hiểu từ điển sẽ rất hiệu quả. `{v. k cho k, v trong my_dict. items()}`python. Như mọi khi, chúng tôi cũng sẽ xem xét các giải pháp khác

Mục lục

Video Tổng Hợp

https. //youtube. be/lN5qX73H2BcKhông thể tải video vì JavaScript bị tắt. 4 cách đảo ngược từ điển bằng Python với My Hero Academia Quirks (https. //youtube. be/lN5qX73H2Bc)

Có thể đảo ngược từ điển trong Python không?

Để bổ sung cho các bài viết của mình, tôi đã tung ra các video đi kèm một cách chậm rãi nhưng chắc chắn. Trên thực tế, đây chỉ là video YouTube thứ hai của tôi, vì vậy hãy yêu thích nó

Trong đó, tôi chia sẻ tất cả các giải pháp tương tự cho vấn đề đảo ngược từ điển mà bạn sẽ tìm thấy trong bài viết này. Tất nhiên, lợi thế của video là bạn có thể xem tất cả trực tiếp với một chút bình luận của riêng tôi. Nếu bạn muốn chuyển đến một phần cụ thể của video, tôi đã thiết lập dấu thời gian trong phần mô tả

Giới thiệu vấn đề

Gần đây, tôi đang làm việc trên một dự án Python mà tôi cần đảo ngược từ điển. Đối với tất cả những người hâm mộ Boku no Hero Academia

Có thể đảo ngược từ điển trong Python không?
(BNHA) ngoài kia, về cơ bản, tôi muốn có thể làm được những việc sau.

my_dict = {
  'Izuku Midoriya': 'One for All', 
  'Katsuki Bakugo': 'Explosion', 
  'All Might': 'One for All', 
  'Ochaco Uraraka': 'Zero Gravity'
}

my_inverted_dict = {
  'One for All': ['Izuku Midoriya', 'All Might'], 
  'Explosion': ['Katsuki Bakugo'], 
  'Ochaco Uraraka': ['Zero Gravity']
}

Trong trường hợp này, chúng tôi có một từ điển các ký tự từ BNHA được ánh xạ tới các đặc điểm của chúng và chúng tôi muốn chuyển đổi từ điển đó thành một từ điển các đặc điểm được ánh xạ tới các ký tự có chúng

Thật không may, từ điển gốc có các giá trị không phải là duy nhất, vì vậy việc lật ngược từ điển sẽ dẫn đến mất khóa. Thay vào đó, chúng tôi muốn tích lũy danh sách các khóa cho từng giá trị không phải là duy nhất trong khi thực hiện đảo ngược. Hóa ra, điều này khá dễ thực hiện

Ghi chú. Nếu bạn đang muốn thực hiện tra cứu từ điển ngược (tôi. e. lấy một khóa cho trước một giá trị), tôi có cả một bài viết khác về điều đó. Nếu không, hãy tiếp tục

Các giải pháp

Nếu chúng tôi muốn đảo ngược một từ điển, chúng tôi có một số tùy chọn. Từ cách hiểu đến vòng lặp, chúng ta sẽ xem xét tất cả các giải pháp thực tế

Đảo ngược từ điển với Bản đồ và đảo ngược

Hãy bắt đầu loạt tùy chọn của chúng tôi bằng một trong những tùy chọn ngắn gọn hơn

my_inverted_dict = dict(map(reversed, my_dict.items()))

Ở đây, chúng tôi sử dụng chức năng bản đồ áp dụng chức năng đảo ngược cho tất cả các mục trong từ điển. Sau đó, chúng tôi lấy đối tượng bản đồ và chuyển đổi nó thành từ điển. Kết quả trông giống như sau

my_inverted_dictionary = {
  'One for All': 'All Might', 
  'Explosion': 'Katsuki Bakugo', 
  'Zero Gravity': 'Ochaco Uraraka'
}

Tất nhiên, nếu muốn đảm bảo không mất Midoriya, chúng ta không nên dùng cách này. Nếu không, đây sẽ là một giải pháp hoàn hảo

Đảo ngược từ điển với Zip

Theo Capi Etheriel

Có thể đảo ngược từ điển trong Python không?
, vẫn còn một cách khác để đảo ngược từ điển với các giá trị duy nhất. Cụ thể, họ đã đề cập đến việc nén các khóa và giá trị theo thứ tự ngược lại và chuyển đổi đầu ra thành từ điển.

dict(zip(my_dict.values(), my_dict.keys()))

Lần đầu tiên nhìn thấy giải pháp này, tôi hơi nghi ngờ liệu nó có thực sự hiệu quả hay không. Rốt cuộc, cho đến Python 3. 7, từ điển không có thứ tự

Có thể đảo ngược từ điển trong Python không?
. Nói cách khác, tôi cảm thấy không rõ ràng rằng `values()`python và `keys()`python sẽ trả về các danh sách thực sự xếp hàng. Đó là lý do tại sao chúng tôi thường sử dụng một phương thức như `items()`python để đảm bảo chúng tôi nhận được các khóa và giá trị cùng nhau thành các cặp.

Chà, tôi tiếp tục đào. Rõ ràng, `keys()`python và `values()`python luôn tương ứng với giả định là không có thay đổi nào đối với từ điển giữa các lần gọi—ít nhất là theo một số người trên Stack Overflow

Có thể đảo ngược từ điển trong Python không?
. Tất nhiên, hãy lưu ý rằng chúng ta cũng sẽ mất Midoriya với giải pháp này.

{
  'One for All': 'All Might', 
  'Explosion': 'Katsuki Bakugo', 
  'Zero Gravity': 'Ochaco Uraraka'
}

Nói cách khác, nếu bạn có các giá trị duy nhất, đây có thể là tùy chọn dành cho bạn

Đảo ngược một từ điển với một sự hiểu biết

Trong Python 2. 7 trở lên, chúng ta có thể sử dụng khả năng hiểu từ điển để đảo ngược từ điển. Thật không may, nó rơi vào cùng một vấn đề đã đề cập trước đó, nhưng nó đã hoàn thành công việc cho các giá trị duy nhất

my_inverted_dict = {value: key for key, value in my_dict.items()}

Một lần nữa, đây là kết quả của việc đảo ngược từ điển ví dụ của chúng tôi

my_inverted_dictionary = {
  'One for All': 'All Might', 
  'Explosion': 'Katsuki Bakugo', 
  'Zero Gravity': 'Ochaco Uraraka'
}

Như chúng ta có thể thấy, chúng ta làm mất một trong những chiếc chìa khóa của mình. Có lẽ có một cách tốt hơn để đảo ngược một từ điển

Đảo ngược từ điển với Defaultdict

May mắn thay, có một cách khác. Nhờ người bạn của chúng tôi, Niels van Galen Last

Có thể đảo ngược từ điển trong Python không?
, chúng tôi có thể hoàn thành chính xác những gì chúng tôi cần trong ba dòng mã.

from collections import defaultdict
my_inverted_dict = defaultdict(list)
{my_inverted_dict[v].append(k) for k, v in my_dict.items()}

Ở đây, chúng tôi đã chọn tận dụng đối tượng `defaultdict`python từ `collections`python. Nó cho phép chúng tôi đặt giá trị mặc định cho các khóa. Trong trường hợp này, chúng tôi đã chọn một giá trị mặc định của danh sách, vì vậy chúng tôi có thể nối thêm dữ liệu mà không gặp rủi ro về lỗi thời gian chạy. Kiểm tra kết quả

________số 8_______

Vì `defaultdict`python hoạt động giống như một `dict`python thông thường nên chúng ta có thể tương tác với nó như nhau. Đây là giải pháp tuyệt vời nếu bạn không có bất kỳ yêu cầu nghiêm ngặt nào về

my_inverted_dict = dict(map(reversed, my_dict.items()))
6 và các giá trị của bạn không phải là duy nhất

Tất cả những gì đã nói, giải pháp này được coi là phương pháp không phù hợp

Có thể đảo ngược từ điển trong Python không?
(đồng thời, tôi thích một nguồn tốt hơn Stack Overflow). Rốt cuộc, chúng tôi không sử dụng cách hiểu từ điển như dự định. Nó dùng để tạo từ điển, nhưng chúng tôi đang sử dụng nó để sửa đổi từ điển bên ngoài.

Đảo ngược từ điển với vòng lặp For

Một cách khác để đảo ngược từ điển là sử dụng vòng lặp for. Điều này cho phép chúng tôi lặp lại tập hợp ánh xạ và xây dựng chính xác các ánh xạ mới bằng tay. Hãy xem

my_inverted_dict = dict()
for key, value in my_dict.items():
    my_inverted_dict.setdefault(value, list()).append(key)

Với phương pháp này, chúng tôi có thể đảo ngược từ điển trong khi vẫn giữ nguyên tất cả các khóa ban đầu của mình. Hãy xem điều gì sẽ xảy ra nếu chúng ta chạy đoạn mã này

________số 8_______

Tuyệt vời. Chúng tôi có chính xác những gì chúng tôi cần, nhưng điều gì xảy ra nếu chúng tôi muốn trả lại từ điển này về dạng ban đầu?

Hoàn nguyên đảo ngược

Trong trường hợp cơ bản khi tất cả các khóa và giá trị là duy nhất, chúng tôi có thể hoàn nguyên từ điển về ánh xạ ban đầu bằng cách sử dụng cùng một cách hiểu từ điển mà chúng tôi đã trình bày

my_inverted_dict = dict(map(reversed, my_dict.items()))
1

Thật không may, điều này không hoạt động với từ điển ánh xạ khóa vào danh sách. Đó là bởi vì danh sách trong Python là loại không thể băm. Nói cách khác, Python không cho phép danh sách làm khóa trong từ điển vì danh sách không phải là bất biến

Có thể đảo ngược từ điển trong Python không?
.

May mắn thay, việc hoàn nguyên từ điển của chúng ta dễ dàng hơn so với việc đảo ngược nó ngay từ đầu. Chúng ta có thể sử dụng cách hiểu từ điển sau

my_inverted_dict = dict(map(reversed, my_dict.items()))
2

Như chúng ta có thể thấy, chúng ta tạo một cặp khóa-giá trị mới cho mỗi giá trị đơn lẻ trong mỗi danh sách bằng cách sử dụng cấu trúc vòng lặp kép này

Hiệu suất

Gần đây, tôi nghĩ sẽ rất thú vị nếu bắt đầu thêm thông tin về hiệu suất vào các bài viết này. Đặc biệt, tôi quan tâm đến việc so sánh các giải pháp này theo thời gian chạy của chúng. Để làm điều đó, chúng tôi sẽ sử dụng thư viện

my_inverted_dict = dict(map(reversed, my_dict.items()))
7. Trước khi chúng tôi có thể chạy các số liệu của mình, chúng tôi sẽ cần thiết lập các giải pháp của mình theo chuỗi

my_inverted_dict = dict(map(reversed, my_dict.items()))
3

Với chuỗi của chúng tôi trong tay, chúng tôi có thể chạy thử nghiệm của mình

my_inverted_dict = dict(map(reversed, my_dict.items()))
4

Hóa ra, việc hiểu từ điển rất nhanh. Tuy nhiên, hãy lưu ý rằng nó không thể xử lý các giá trị không phải là duy nhất. Nếu đó không phải là một hạn chế, thì hãy sử dụng giải pháp nhanh. Mặt khác, việc bạn chọn phương pháp nào không thực sự quan trọng

Ngoài ra, để tham khảo, tôi đã chạy cái này trên máy tính để bàn Windows 10 của mình với Python 3. 7. 3. Nếu bạn muốn tìm hiểu thêm về quy trình thử nghiệm hiệu suất này, tôi có một bài viết về điều đó

Tóm tắt một chút

Sử dụng các phương pháp trên, chúng ta có thể đảo ngược bất kỳ từ điển nào

my_inverted_dict = dict(map(reversed, my_dict.items()))
5

Hầu như mọi kiểu chuyển đổi từ điển khác đều nằm ngoài phạm vi của hướng dẫn này. Tuy nhiên, nếu bạn có bất kỳ câu hỏi cụ thể nào, vui lòng liên hệ trong phần nhận xét

Khi bạn ở đây, bạn cũng có thể quan tâm đến những bài viết này

  • Cách viết hiểu danh sách bằng Python
  • Cách chuyển đổi hai danh sách thành từ điển trong Python
  • Búa, Búa, Kéo Sử dụng Số học Mô-đun

Nếu bạn không chắc nên bắt đầu từ đâu, tôi đề xuất danh sách Đoạn mã Python cho các vấn đề hàng ngày của tôi. Ngoài ra, bạn có thể nhận các bài viết mới nhất được gửi đến hộp thư đến của mình bằng cách trở thành thành viên

Có thể đảo ngược từ điển trong Python không?
hoặc đăng ký nhận bản tin.

Khi bạn ở đây, hãy xem một số sản phẩm BNHA có liên quan này trên Amazon (quảng cáo)

  • Todoroki Hoody
    Có thể đảo ngược từ điển trong Python không?
  • Bakugo Action Figure
    Có thể đảo ngược từ điển trong Python không?
  • Móc khóa sang trọng Uraraka
    Có thể đảo ngược từ điển trong Python không?

Cảm ơn một lần nữa vì đã gắn bó

Cách sử dụng Python (42 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

Có thể đảo ngược từ điển trong Python không?
,

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

Tôi có thể đảo ngược từ điển bằng Python không?

Phương pháp #1. Sử dụng OrderedDict() + Reverse() + items() . Các phiên bản cũ không giữ thứ tự trong từ điển, do đó phải chuyển đổi sang OrderedDict để thực hiện tác vụ này.

Từ điển có thể được trả về từ một hàm không?

Mọi đối tượng, chẳng hạn như từ điển, có thể là giá trị trả về của hàm Python . Tạo đối tượng từ điển trong thân hàm, gán nó cho bất kỳ biến nào và trả lại từ điển cho người gọi hàm. Giá trị dữ liệu được lưu trữ dưới dạng khóa. cặp giá trị trong từ điển.