From 6ca9a9e3b768e8e4bd29813d9f649da7845252a3 Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 16 Oct 2023 23:14:55 -0400 Subject: [PATCH] Solution: always sort components by amount --- CHANGELOG.md | 5 +++++ src/pyEQL/solution.py | 12 ++++-------- src/pyEQL/utils.py | 2 ++ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65bb9d70..330b9f06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- `Solution.components` is now automatically sorted in descending order of amount, for + consistency with `anions`, `cations`, and `neutrals`. + ### Fixed - Bugfix in `as_dict` to make serialization via `dumpfn` possible. Previously, `Quantity` diff --git a/src/pyEQL/solution.py b/src/pyEQL/solution.py index d6b6de62..0501794d 100644 --- a/src/pyEQL/solution.py +++ b/src/pyEQL/solution.py @@ -495,8 +495,7 @@ def cations(self) -> dict[str, float]: Returns the subset of `components` {formula: moles} that are cations. The returned dict is sorted by amount in descending order. """ - d = {k: v for k, v in self.components.items() if self.get_property(k, "charge") > 0} - return dict(sorted(d.items(), key=lambda x: x[1], reverse=True)) + return {k: v for k, v in self.components.items() if self.get_property(k, "charge") > 0} @property def anions(self) -> dict[str, float]: @@ -504,8 +503,7 @@ def anions(self) -> dict[str, float]: Returns the subset of `components` {formula: moles} that are anions. The returned dict is sorted by amount in descending order. """ - d = {k: v for k, v in self.components.items() if self.get_property(k, "charge") < 0} - return dict(sorted(d.items(), key=lambda x: x[1], reverse=True)) + return {k: v for k, v in self.components.items() if self.get_property(k, "charge") < 0} @property def neutrals(self) -> dict[str, float]: @@ -513,8 +511,7 @@ def neutrals(self) -> dict[str, float]: Returns the subset of `components` {formula: moles} that are neutral (not charged). The returned dict is sorted by amount in descending order. """ - d = {k: v for k, v in self.components.items() if self.get_property(k, "charge") == 0} - return dict(sorted(d.items(), key=lambda x: x[1], reverse=True)) + return {k: v for k, v in self.components.items() if self.get_property(k, "charge") == 0} # TODO - need tests for viscosity @property @@ -1113,8 +1110,7 @@ def get_components_by_element(self) -> dict[str, list]: d = {} # by sorting the components according to amount, we ensure that the species # are sorted in descending order of concentration in the resulting dict - components = dict(sorted(self.components.items(), key=lambda x: x[1], reverse=True)) - for s in components: + for s in self.components: # determine the element and oxidation state elements = self.get_property(s, "elements") diff --git a/src/pyEQL/utils.py b/src/pyEQL/utils.py index 9b49a1c8..48bebb87 100644 --- a/src/pyEQL/utils.py +++ b/src/pyEQL/utils.py @@ -45,6 +45,8 @@ def __getitem__(self, key): def __setitem__(self, key, value): super().__setitem__(standardize_formula(key), value) + # sort contents anytime an item is set + self.data = dict(sorted(self.items(), key=lambda x: x[1], reverse=True)) def __delitem__(self, key): super().__delitem__(standardize_formula(key))