Cách so sánh các giá trị trong từ điển python

Tôi nghĩ rằng bạn đang hiểu lầm về

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
1.
# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
1 được thiết kế để hoạt động với bất kỳ đối tượng nào, ngay cả khi chúng không hỗ trợ toán tử ==. Nói cách khác, NotImplemented trở thành False

>>> "0" == 0
False

Vì vậy,

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
3 trở thành Sai phù hợp với mong đợi của bạn “Hoặc Không được thực hiện”

Cách so sánh các giá trị trong từ điển python
PeterL

Tôi không rõ tại sao không có ngữ nghĩa hợp lý?

Hãy xem ngữ nghĩa trong Python 2

  • dict==dict din't care order (ditto trong Python 3)
  • Python 2 dict không đảm bảo trật tự. (Python 3 giữ thứ tự chèn)
  • keys(), values(), items() có thứ tự nhất quán (ditto trong Python 3)
d1 = {'a': 1, 'b': 2}
d2 = {'b': 2, 'a': 1}
print(d1.values() == d2.values())  # What returned here?

Bạn mong đợi điều gì ở đây? .
Tôi tin rằng không ai nghĩ rằng ngữ nghĩa “True in 1/len(d), False nếu không” là tốt.

Có một số ngữ nghĩa có thể

  • So sánh theo trình tự
  • So sánh dưới dạng bộ
  • So sánh dưới dạng nhiều bộ

Tôi không nghĩ rằng không có điều nào ở trên là ngữ nghĩa mặc định tốt

Tôi nghĩ rằng tài liệu này gây hiểu nhầm đến mức nó sai

mệnh lệnh. các giá trị bình đẳng cuối cùng rơi vào ngữ nghĩa mặc định cho bình đẳng, kiểm tra danh tính

>>> d = {'key': 1}
>>> x = d.values()
>>> x == x
True

lý do d. giá trị(). = d. các giá trị () không phải vì các đối tượng giá trị luôn so sánh không bằng nhau, mà bởi vì mỗi khi bạn gọi phương thức, nó sẽ trả về một đối tượng (khác biệt) mới

Liên quan đến vấn đề 12445. các đối tượng giá trị chế độ xem chính tả bị thiếu tp_richcmp và tp_as_number - Trình theo dõi Python, tôi phủ nhận rằng không có ngữ nghĩa có ý nghĩa cho các đối tượng giá trị. Chúng rõ ràng là một túi các đối tượng tùy ý không có thứ tự, không phải là một bộ hay một chuỗi, chỉ là một bộ sưu tập. Chúng ta có thể định nghĩa bình đẳng một cách có ý nghĩa theo hai cách

  • hai đối tượng giá trị bằng nhau nếu chúng chứa các phần tử giống nhau, cùng số lần, theo bất kỳ thứ tự nào;

  • hoặc hai đối tượng giá trị bằng nhau nếu cả hai đều là chế độ xem của cùng một lệnh

Bài kiểm tra thứ hai gần như rẻ như bài kiểm tra danh tính trên chính các đối tượng giá trị. Thay vì

return self is other

chúng tôi trả về

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
4 (ngoại trừ việc dict sở hữu đối tượng giá trị không được hiển thị với mã Python, vì vậy tôi đoán bài kiểm tra này sẽ chỉ có thể được viết bằng C)

Thử nghiệm đầu tiên đắt hơn. Tôi không thể nghĩ làm thế nào để làm bài kiểm tra một cách hiệu quả. Nếu chúng có thể băm được, chúng ta có thể sử dụng Counter() nhưng không phải lúc nào chúng cũng có thể băm được

Cách so sánh các giá trị trong từ điển python
PeterL

Điểm hay. Tôi có hai ký tự dữ liệu - các khóa giống nhau - có giá trị nào thay đổi không? .
Vấn đề tôi thấy với giá trị bằng nhau trả về

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
5 là nó ngụ ý rằng chúng (các giá trị) khác nhau.
Mặc dù, tôi thừa nhận, trong trường hợp này, việc so sánh trực tiếp các ký tự nói chung sẽ hiệu quả.

Trong trường hợp sử dụng của bạn, "so sánh eo biển của các lệnh" hoặc

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
6 là giải pháp phù hợp

Bất kỳ ngữ nghĩa nào của

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
7 (nhận dạng chính tả, trình tự, tập hợp và nhiều tập hợp) sẽ không hoạt động trong trường hợp này

Cách so sánh các giá trị trong từ điển python
PeterL

Một ví dụ phức tạp hơn

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
1

Có nên so sánh

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
8 bằng nhau không?

Xem xét điều này

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
3

Bạn vẫn nghĩ so sánh

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
8 bằng nhau chứ?
Tôi không nghĩ đó là cách so sánh hữu ích.

Vâng, tôi có thể thấy điều đó. Tôi không nghĩ rằng ví dụ của tôi là tốt, nhưng tôi vẫn hiểu ý của bạn.
Và tôi hiểu rằng so sánh mặc định cho các đối tượng là danh tính và đó là lý do tại sao điều này mang lại cho

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
5.

Mặc dù vậy, tôi vẫn lo lắng về sự trở lại của

# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
5 khi so sánh. Tôi nghĩ nó gây hiểu lầm, vì nó ngụ ý rằng nó đang thực hiện một “sự so sánh hợp lý”. Việc nó luôn trả về
# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
5 (ngay cả khi so sánh với self) có thể gây nhầm lẫn. (Tôi hiểu tại sao điều đó lại xảy ra, tôi chỉ đang xem xét liệu nó có hữu ích hay gây nhầm lẫn khi làm điều đó. ) Tôi lưu ý rằng Julian trong Số phát hành 12445 cũng có sự nhầm lẫn tương tự, vì vậy tôi nghi ngờ mình có thể không đơn độc. Có sự khác biệt giữa “không thể so sánh được” và “không giống nhau”. Nhưng thật không may, == trên các giá trị trả về một
# Comparing values. Answer always False. Why?
print(d1.values() == d1.values())  # False; I expected True. Or NotImplemented
print(d1.values() == d2.values())  # False; I expected True. Or NotImplemented
5 (theo suy nghĩ của tôi, ngụ ý không giống nhau) khi ý nghĩa thực sự của nó là “không thể so sánh được”

Tôi lưu ý rằng các tài liệu đưa ra quan điểm về điều này, nhưng đó có thể không phải là nơi đầu tiên ai đó tìm kiếm. Và tôi đang suy nghĩ về một trường hợp sử dụng tốt

Một tùy chọn có thể là nó tăng

>>> "0" == 0
False
0, mặc dù điều đó không bình thường và có thể có các vấn đề khác mà tôi không biết. Tôi tự hỏi liệu một
>>> "0" == 0
False
5 có liên quan không?

Ngoài ra, làm các bài kiểm tra mà @rhettinger đã liệt kê?

Vừa thấy @rhettinger thực hiện một cuộc thăm dò trên Twitter về “điều này làm được gì” - rất muốn xem kết quả

Cách so sánh các giá trị trong từ điển python
câu hỏi

Cách so sánh các giá trị trong từ điển python
ĐộiSpen210

Vấn đề là kết hợp các giá trị để kiểm tra sự bằng nhau

Cách so sánh các giá trị trong từ điển python
người hùng biện

Phép tính là O(n**2) là trường hợp tổng quát…

Có phải sự phức tạp của tính toán là lý do chính khiến một phép so sánh bình đẳng có ý nghĩa hơn không được cung cấp?

Bạn có thể sử dụng == trên từ điển trong Python không?

Theo tài liệu python, bạn thực sự có thể sử dụng toán tử == trên từ điển .

Từ điển có thể có 2 giá trị trong Python không?

Ý tưởng chung. Trong Python, nếu chúng ta muốn từ điển có nhiều giá trị cho một khóa, chúng ta cần lưu trữ các giá trị này trong vùng chứa riêng của chúng trong từ điển . Để làm như vậy, chúng tôi cần sử dụng một vùng chứa làm giá trị và thêm nhiều giá trị của chúng tôi vào vùng chứa đó. Các thùng chứa phổ biến là danh sách, bộ dữ liệu và bộ.

Làm cách nào để kiểm tra xem một phần tử có trong từ điển trong Python không?

Sử dụng phương thức has_key() trả về giá trị true nếu từ khóa đã cho có sẵn trong từ điển, nếu không, phương thức này trả về giá trị false . Với phương thức sẵn có has_key(), sử dụng câu lệnh if để kiểm tra xem key có trong từ điển hay không.

Làm cách nào để truy cập giá trị trong từ điển Python?

Các giá trị trong từ điển Python có thể được truy cập bằng cách đặt khóa trong dấu ngoặc vuông bên cạnh từ điển . Các giá trị có thể được viết bằng cách đặt khóa trong dấu ngoặc vuông bên cạnh từ điển và sử dụng toán tử gán ( = ). Nếu khóa đã tồn tại, giá trị cũ sẽ bị ghi đè.