Title: Add symmetric_difference to Counter · Issue #138682 · python/cpython · GitHub
Open Graph Title: Add symmetric_difference to Counter · Issue #138682 · python/cpython
X Title: Add symmetric_difference to Counter · Issue #138682 · python/cpython
Description: Proposal This was recently proposed on discuss.python.org and was also proposed 15 years ago. The old proposal did not move forward because: There were almost no known use cases. The Counter class was missing other multiset methods such ...
Open Graph Description: Proposal This was recently proposed on discuss.python.org and was also proposed 15 years ago. The old proposal did not move forward because: There were almost no known use cases. The Counter class ...
X Description: Proposal This was recently proposed on discuss.python.org and was also proposed 15 years ago. The old proposal did not move forward because: There were almost no known use cases. The Counter class ...
Opengraph URL: https://github.com/python/cpython/issues/138682
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Add symmetric_difference to Counter","articleBody":"### Proposal\n\nThis was [recently proposed on discuss.python.org](https://discuss.python.org/t/add-symmetric-difference-to-collections-counter/103579) and was also [proposed 15 years ago](https://mail.python.org/pipermail/python-list/2010-August/584604.html).\n\nThe old proposal did not move forward because:\n* There were almost no known use cases.\n* The Counter class was missing other multiset methods such as subset, superset, and equality tests.\n* No other language implementation could be found that supported this operation.\n* Math articles about multisets did not mention this operation.\n* It was a one-off request that seemed unlikely to recur.\n\nSince that time, some of those reasons have changed:\n\n* We received a second request, so this is no longer a one-off.\n* Since Python 3.10, Counter has full support for all the standard multiset methods.\n* Maple subsequently added [symdiff](https://de.maplesoft.com/support/help/maple/view.aspx?path=MultiSet/symmdiff\n) so now there is a precedent in another language.\n\nAlso looking at the discussions, the most obvious workaround `(p | q) - (p \u0026 q)` has the disadvantage of not working with signed inputs. A better workaround would be `(p - q) | (q - p)` which always gives the difference between the maximum count and the minimum count regardless of sign.\n\nAt this point, I'm inclined to complete the multiset API by adding `symmetric_difference`. With all the other multiset methods now being supported, there is a greater cognitive load for the method being missing than for it being present. It is easier to teach that all set operators are supported than teaching that all but one are supported.\n\nThe only downsides I can think of are:\n1) It's possible (and perhaps likely) that this method will never get used.\n2) Someone reading the code `p ^ q` would need to think carefully about what it does.\n\n\u003c!-- gh-linked-prs --\u003e\n### Linked PRs\n* gh-138766\n\u003c!-- /gh-linked-prs --\u003e\n","author":{"url":"https://github.com/rhettinger","@type":"Person","name":"rhettinger"},"datePublished":"2025-09-08T19:58:26.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/138682/cpython/issues/138682"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:c72cdba2-1cb3-0111-6851-60a04322e715 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 89DC:27C161:1EBFAFD:2CA6E01:6A54F253 |
| html-safe-nonce | f78ad0b6d116accca5999eb284c911a9c92f5f9a72523f08150a7b5b33744cdf |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4OURDOjI3QzE2MToxRUJGQUZEOjJDQTZFMDE6NkE1NEYyNTMiLCJ2aXNpdG9yX2lkIjoiNjQ1MzE4MDEwMDUwNjg3NDQ1MiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 8d4a846586bfcd1f8410350aa13eb1d5bede232c5c67fd9f22e52a0b8d2e8352 |
| hovercard-subject-tag | issue:3395509033 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/138682/issue_layout |
| twitter:image | https://opengraph.githubassets.com/96fe9eff25e001d7d4a98b884e9709ad5f1927be8b4b4fc1e31e02017d878552/python/cpython/issues/138682 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/96fe9eff25e001d7d4a98b884e9709ad5f1927be8b4b4fc1e31e02017d878552/python/cpython/issues/138682 |
| og:image:alt | Proposal This was recently proposed on discuss.python.org and was also proposed 15 years ago. The old proposal did not move forward because: There were almost no known use cases. The Counter class ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | rhettinger |
| hostname | github.com |
| expected-hostname | github.com |
| None | eae2aab99907699a22d2c8449aa683ca74454fca87211b98f7c7b722086b2839 |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | dd26d3896747463b6bd56edd5e290edb595c3cbc |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width