Computer >> Máy Tính >  >> Lập trình >> Python

Làm thế nào để thực hiện các phép tính với Từ điển trong Python?

Vấn đề

Bạn muốn thực hiện các phép tính khác nhau (ví dụ:giá trị nhỏ nhất, giá trị lớn nhất, sắp xếp, v.v.) trên từ điển dữ liệu.

Giải pháp.

Chúng tôi sẽ tạo một từ điển với các vận động viên quần vợt và các danh hiệu của họ.

PlayerTitles = {
   'Federer': 20,
   'Nadal': 20,
   'Djokovic': 17,
   'Murray': 3,
   'Theim' : 1,
   'Zverev': 0
}

1.Chúng tôi có một từ điển với tên người chơi và các danh hiệu lớn nhất mà mỗi người chơi giành được. Bây giờ chúng ta hãy thử tìm ra người chơi có số danh hiệu ít nhất

#type(PlayerTitles)
print(f"Output \n*** The minimum value in the dictionary is {min(PlayerTitles)} ")

Đầu ra

*** The minimum value in the dictionary is Djokovic

Đây có lẽ không phải là điều chúng ta muốn vì chúng ta thực sự đang cố gắng thực hiện một phép tính liên quan đến các giá trị từ điển. Vì vậy, chúng ta hãy thử khắc phục điều này bằng cách sử dụng phương thức giá trị () của từ điển.

print(f"Output \n*** The minimum value in the dictionary is {min(PlayerTitles.values())} ")

Đầu ra

*** The minimum value in the dictionary is 0

3. Thật không may, điều này thường không chính xác những gì bạn muốn. Ví dụ:bạn có thể muốn biết thông tin về các khóa tương ứng, tức là tên người chơi có số danh hiệu ít nhất.

4. Bạn có thể nhận được khóa tương ứng với giá trị tối thiểu hoặc tối đa nếu bạn cung cấp hàm khóa cho min () và max ().

print(f"Output \n***{min(PlayerTitles, key=lambda k: PlayerTitles[k])} ")

Đầu ra

***Zverev

5. Tuy nhiên, để nhận được giá trị nhỏ nhất, bạn cần phải thực hiện tra cứu thêm.

min_titles = PlayerTitles[min(PlayerTitles, key=lambda k: PlayerTitles[k])]
print(f"Output \n***{min_titles} ")

Đầu ra

***0

6. Giải pháp liên quan đến zip () giải quyết vấn đề bằng cách "đảo ngược" từ điển thành một chuỗi các cặp (giá trị, khóa). Khi thực hiện so sánh trên các bộ giá trị như vậy, phần tử giá trị được so sánh đầu tiên, sau đó là khóa.

Điều này cung cấp cho chúng tôi chính xác hành vi mà chúng tôi muốn và cho phép dễ dàng thực hiện các thao tác rút gọn và sắp xếp đối với nội dung từ điển bằng một câu lệnh duy nhất.

min_titles = min(zip(PlayerTitles.values(), PlayerTitles.keys()))
max_titles = max(zip(PlayerTitles.values(), PlayerTitles.keys()))

print(f"Output \n***{min_titles , max_titles} ")

Đầu ra

***((0, 'Zverev'), (20, 'Nadal'))

7. Tương tự, để xếp hạng dữ liệu, hãy sử dụng zip () với sorted ()

titles_sorted = sorted(zip(PlayerTitles.values(), PlayerTitles.keys()))
print(f"Output \n***{titles_sorted} ")

Đầu ra

***[(0, 'Zverev'), (1, 'Theim'), (3, 'Murray'), (17, 'Djokovic'), (20, 'Federer'), (20, 'Nadal')]

8.Khi thực hiện các phép tính này, hãy lưu ý rằng zip () tạo một trình lặp chỉ có thể được sử dụng một lần.

titles_and_players = zip(PlayerTitles.values(), PlayerTitles.keys())
print(f"Output \n***{min(titles_and_players)} ")

Đầu ra

***(0, 'Zverev')

9. Nếu chúng ta cố gắng gọi nó một lần nữa, chúng ta sẽ gặp phải một ngoại lệ là chuỗi trống.

10. Cần lưu ý rằng trong các phép tính liên quan đến các cặp (giá trị, khóa), khóa sẽ được sử dụng để xác định kết quả trong trường hợp nhiều mục nhập xảy ra có cùng giá trị.

Ví dụ:trong các phép tính như min () và max (), mục nhập có khóa nhỏ nhất hoặc lớn nhất sẽ được trả về nếu có giá trị trùng lặp. Đó là lý do khi chúng tôi chọn những tay vợt có số danh hiệu tối đa, chúng tôi chỉ nhận được một giá trị duy nhất là Nadal. (Xem đầu ra của bước 7).