Trừ 2 từ điển python

\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\. -\. \rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span} . #1 \. }\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\ . #1 \. }\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\ . 8,0]{x212B}}\)

không có tiêu đề

Tìm các từ trong cuốn sách không có trong danh sách từ từ words.txt là một vấn đề mà bạn có thể nhận ra là phép trừ tập hợp;

subtract lấy từ điển d1d2 và trả về một từ điển mới chứa tất cả các khóa từ d1 không có trong d2. Vì chúng tôi không thực sự quan tâm đến các giá trị, chúng tôi đặt tất cả chúng thành Không có

def subtract(d1, d2):
    res = dict()
    for key in d1:
        if key not in d2:
            res[key] = None
    return res

Để tìm những từ trong sách không có trong words.txt, chúng ta có thể sử dụng

words = process_file('words.txt')
diff = subtract(hist, words)

print "The words in the book that aren't in the word list are:"
for word in diff.keys():
    print word,
0 để xây dựng biểu đồ cho words.txt, sau đó trừ đi

words = process_file('words.txt')
diff = subtract(hist, words)

print "The words in the book that aren't in the word list are:"
for word in diff.keys():
    print word,

Dưới đây là một số kết quả từ Emma

The words in the book that aren't in the word list are:
 rencontre jane's blanche woodhouses disingenuousness 
friend's venice apartment ...

Một số từ này là tên và sở hữu. Những từ khác, như “rencontre,” không còn được sử dụng phổ biến. Nhưng một vài từ phổ biến thực sự nên có trong danh sách

Bài tập \(\PageIndex{1}\)

Python cung cấp cấu trúc dữ liệu có tên là

words = process_file('words.txt')
diff = subtract(hist, words)

print "The words in the book that aren't in the word list are:"
for word in diff.keys():
    print word,
2 cung cấp nhiều thao tác tập hợp phổ biến. Đọc tài liệu tại và viết chương trình sử dụng phép trừ tập hợp để tìm các từ trong sách không có trong danh sách từ

Giải pháp

http. // thinkpython. com/code/analyze_book2. py


Trang này có tiêu đề 4. 6. Phép trừ từ điển được chia sẻ theo CC BY-NC-SA 3. 0 và được tác giả, phối lại và/hoặc giám tuyển bởi Allen B. Downey (Nhà máy ép trà xanh)

Đăng ký là huyết mạch của LWN. net. Nếu bạn đánh giá cao nội dung này và muốn xem thêm nội dung đó, đăng ký của bạn sẽ giúp đảm bảo rằng LWN tiếp tục phát triển. Vui lòng truy cập trang này để tham gia và giữ LWN trên mạng

Bởi Jake Cạnh
13 Tháng Ba, 2019

Đề xuất thêm toán tử từ điển mới cho Python đã tạo ra một PEP và hai chủ đề lớn trong danh sách gửi thư ý tưởng python. Ở một mức độ nào đó, nó bắt đầu giống như "mớ hỗn độn PEP 572"; . Cho đến nay, vẫn chưa có quyết định chính thức nào được đưa ra về cách hội đồng chỉ đạo mới sẽ xử lý các tuyên bố PEP, mặc dù việc xem xét các PEP mở là "ưu tiên cao nhất" của hội đồng. PEP này có lẽ sẽ được thêm vào quy trình; . 8 ngay cả khi nó đã sớm được chấp nhận, vì vậy sẽ có nhiều thời gian để tìm ra tất cả trước 3. 9 được phát hành vào khoảng năm 2021

João Matos nêu ý tưởng trong một bài đăng vào cuối tháng Hai. (Email đó phần lớn là tệp đính kèm HTML, không được lưu trữ rõ ràng, nội dung của nó có thể được xem tại đây hoặc được trích dẫn bởi những người khác trong chuỗi. ) Trong tin nhắn đó, anh đề nghị thêm hai toán tử mới cho từ điển. "+" và "+=". Chúng sẽ được sử dụng để hợp nhất hai từ điển

    tmp = dict_a + dict_b      # results in all keys/values from both dict_a and dict_b
    dict_a += dict_b           # same but done "in place"
Trong cả hai trường hợp, bất kỳ khóa nào xuất hiện trong cả hai từ điển sẽ lấy giá trị của nó từ dict_b. Hiện có một số cách để thực hiện thao tác "cập nhật" này, bao gồm sử dụng toán tử giải nén từ điển "**" được chỉ định trong PEP 448 ("Khái quát hóa giải nén bổ sung").
    tmp = { **dict_a, **dict_b }     # like tmp = dict_a + dict_b
    dict_a = { **dict_a, **dict_b }  # like dict_a += dict_b
Hoặc, như Rhodri James đã chỉ ra, người ta cũng có thể sử dụng phương thức cập nhật từ điển ().
    tmp = dict_a.copy(); tmp.update(dict_b)  # like tmp = dict_a + dict_b
    dict_a.update(dict_b)                    # like dict_a += dict_b     

Ý tưởng của Matos đã thu hút sự chú ý của Guido van Rossum, người thích nó. Nó tương tự như , ông nói

Điều này có thể gây tranh cãi. Nhưng tôi thích ý tưởng. Rốt cuộc, chúng ta có `danh sách. mở rộng(x)` ~~ `danh sách += x`. Bài toán hóc búa cần giải quyết là phải làm gì đối với `d1 + d2` khi có các phím trùng nhau. Tôi đề xuất làm cho d2 thắng trong trường hợp này, đó là điều xảy ra trong `d1. cập nhật (d2)` dù sao đi nữa. Nếu bạn muốn nó theo cách khác, chỉ cần viết `d2 + d1`

Có một số câu hỏi về toán tử "+" không giao hoán (i. e. trong đó a+b không giống với b+a), nhưng một số người đã chỉ ra rằng có một số cách sử dụng toán tử "+" trong Python không phải là giao hoán, bao gồm cả phép nối chuỗi (e. g. 'a'+'b' không giống với 'b'+'a'). Steven D'Aprano gợi ý rằng thay vì "bổ sung", hoạt động nên được xử lý như một , sử dụng ". " nhà điều hành. Anh ấy cũng có một số suy nghĩ khác về các toán tử từ điển mới

Điều đó cũng gợi ý d1 & d2 cho giao điểm giữa hai ký tự, nhưng giá trị nào sẽ thắng?

Tôi nghĩ hữu ích hơn giao lộ là phép trừ chính tả. d1 - d2 là một lệnh mới với các khóa/giá trị từ d1 không có trong d2

Tất cả những điều này gợi lại chủ đề về ý tưởng trăn năm 2015 đã được tóm tắt ở đây tại LWN. Tuy nhiên, như một từ Raymond Hettinger trên ghi chú về vấn đề theo dõi lỗi Python, Van Rossum đã từ chối ý tưởng này vào năm 2015. Một số điều đã thay đổi kể từ đó. thứ nhất, Van Rossum không còn là người ra quyết định cuối cùng về những thay đổi đối với ngôn ngữ (dĩ nhiên, mặc dù ý kiến ​​​​của anh ấy vẫn có trọng lượng khá lớn), nhưng anh ấy cũng có ý kiến ​​về tính năng này.

Hettinger đã nói rõ rằng ông phản đối việc thêm một toán tử "+" mới, cả trong một bài viết khác và trong một bài viết về ý tưởng trăn. Anh ấy không coi thao tác này là "cộng" theo một nghĩa nào đó, vì vậy việc sử dụng "+" có vẻ không phải là lựa chọn đúng đắn. Ngoài ra, đã có những lựa chọn thay thế có thể đọc được, bao gồm cả việc sử dụng lớp

[. ] Tôi không chắc chúng ta có thực sự cần một lối tắt cho "d=e. sao chép(); . cập nhật (f)". Mã như thế này xuất hiện cho tôi có lẽ mỗi năm một lần. Có một toán tử cộng trên dicts có thể sẽ giúp tôi tiết kiệm được năm giây mỗi năm

Nếu mã hiện có ở dạng "d=e. sao chép(); . cập nhật (f); . cập nhật (g); . update(h)", chuyển đổi nó thành "d = e + f + g + h" sẽ là một việc hấp dẫn nhưng kém về mặt thuật toán (vì hành vi là bậc hai). Rất có thể, điều đúng đắn cần làm là "d = ChainMap(e, f, g, h)" đối với giải pháp không sao chép hoặc "d = dict(ChainMap(e, f, g, h))" để làm phẳng . Cả hai đều ngắn gọn và rõ ràng

Một vài suy nghĩ ". " có ý nghĩa hơn "+", nhưng điều đó không phổ biến. Phần lớn, bất kỳ sự phản đối nào đối với ý tưởng này đều giống với quan điểm của Hettinger. bổ sung từ điển là không cần thiết và có khả năng gây nhầm lẫn. Nó cũng vi phạm "một số ý tưởng thống nhất về Python", Hettinger nói

Van Rossum đề nghị D'Aprano viết PEP cho một toán tử từ điển mới. Van Rossum cũng nghĩ rằng PEP nên bao gồm phép trừ từ điển để xem xét, mặc dù ý tưởng đó dường như thậm chí còn ít được những người tham gia chủ đề ủng hộ hơn. D'Aprano đã tạo PEP 584 ("Thêm toán tử + và - vào lớp dict tích hợp sẵn");

Là một phần trong đó, Jimmy Girardet đã hỏi vấn đề gì đang được giải quyết bằng cách thêm một toán tử mới, vì có một số lựa chọn thay thế làm điều tương tự. Stefan Behnel lưu ý rằng "+" cho danh sách và bộ dữ liệu, cùng với ". " đối với các bộ, cung cấp một loại biểu thức cơ bản để kết hợp các loại đó, nhưng từ điển thiếu điều đó, đó là "khoảng trống trong ngôn ngữ". Việc thêm một toán tử như vậy sẽ "kích hoạt cú pháp rõ ràng cho thứ gì đó hiển nhiên". Van Rossum cũng có suy nghĩ tương tự

[. ] ngay cả khi bạn biết về **d trong các ngữ cảnh đơn giản hơn, nếu bạn hỏi một người dùng Python điển hình về cách kết hợp hai ký tự thành một ký tự mới, tôi nghi ngờ nhiều người sẽ nghĩ đến {**d1, **d2}. Tôi biết bản thân tôi đã quên nó khi chủ đề này bắt đầu. Nếu bạn hỏi một người mới đã học được một vài điều (e. g. nối chuỗi) nhiều khả năng họ sẽ đoán d1+d2

Có sẵn việc triển khai PEP, nhưng có vẻ như nó vẫn còn lâu mới được chấp nhận—nếu nó từng được chấp nhận. Bản thân PEP có thể cần một số cập nhật. Có vẻ như các đối số để chuyển sang ". " có thể đạt được vị thế. Ngay từ đầu, Van Rossum đã ủng hộ "+", nhưng đã có một số lập luận mạnh mẽ ủng hộ việc chuyển đổi. Gần đây hơn, Van Rossum nói rằng anh ấy đang "làm nóng". ' cũng". Ngoài những lập luận của anh ấy từ rất sớm, có rất ít người khác ủng hộ mạnh mẽ "+" thay vì ". "

Cũng đã có các cuộc thảo luận về các trường hợp phạt góc và những hiểu lầm có thể phát sinh từ các nhà khai thác. Nhưng những phản đối chính dường như hầu hết đều giảm, như họ đã làm trong "cuộc thảo luận" PEP 572, về câu hỏi về "tầm nhìn" của mỗi người đối với ngôn ngữ. Chắc chắn có thể lập luận rằng biểu thức gán PEP 572 (i. e. sử dụng ". =" đối với các phép gán trong câu lệnh) là một thay đổi triệt để hơn đối với ngôn ngữ tổng thể, nhưng nhiều lập luận chống lại "bổ sung" từ điển nghe có vẻ quen thuộc một cách kỳ lạ

Vẫn chưa rõ PEP sẽ được quyết định như thế nào; . Có thể phần nào nói lên rằng không ai trong số bốn thành viên hội đồng chỉ đạo khác tham gia nghiêm túc vào cuộc thảo luận, nhưng cũng có trường hợp nhiều người có thể coi python-ideas là một diễn đàn khó theo kịp. Chỉ có thời gian mới trả lời được điều gì xảy ra với PEP 584 (và phần còn lại của PEP đang chờ xử lý)