Skip to content

Commit 83d9adc

Browse files
committed
factorized a unique_multi helper function
it computes unique values across multiple iterables
1 parent 9ed4b58 commit 83d9adc

File tree

3 files changed

+14
-10
lines changed

3 files changed

+14
-10
lines changed

larray/core/array.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8469,10 +8469,7 @@ def stack(elements=None, axis=None, title=None, meta=None, dtype=None, **kwargs)
84698469
if not all(isinstance(s, Session) for s in sessions):
84708470
raise TypeError("stack() only supports stacking Session with other Session objects")
84718471

8472-
seen = set()
8473-
all_keys = []
8474-
for s in sessions:
8475-
unique_list(s.keys(), all_keys, seen)
8472+
all_keys = unique_multi(s.keys() for s in sessions)
84768473
res = []
84778474
for name in all_keys:
84788475
try:

larray/core/axis.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
_range_to_slice, _seq_group_to_name, _translate_group_key_hdf, remove_nested_groups)
1717
from larray.util.oset import *
1818
from larray.util.misc import (basestring, PY2, unicode, long, duplicates, array_lookup2, ReprString, index_by_id,
19-
renamed_to, common_type, LHDFStore, lazy_attribute, _isnoneslice)
19+
renamed_to, common_type, LHDFStore, lazy_attribute, _isnoneslice, unique_multi)
2020

2121

2222
class Axis(ABCAxis):
@@ -1163,11 +1163,7 @@ def union(self, other):
11631163
other = _to_ticks(other, parse_single_int=True) if '..' in other or ',' in other else [other]
11641164
if isinstance(other, Axis):
11651165
other = other.labels
1166-
unique_labels = []
1167-
seen = set()
1168-
unique_list(self.labels, unique_labels, seen)
1169-
unique_list(other, unique_labels, seen)
1170-
return Axis(unique_labels, self.name)
1166+
return Axis(unique_multi((self.labels, other)), self.name)
11711167

11721168
def intersection(self, other):
11731169
"""Returns axis with the (set) intersection of this axis labels and other labels.

larray/util/misc.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,17 @@ def unique_list(iterable, res=None, seen=None):
236236
return res
237237

238238

239+
def unique_multi(iterable_of_iterables):
240+
"""
241+
Returns a list of all unique elements across multiple iterables. Elements of earlier iterables will come first.
242+
"""
243+
seen = set()
244+
res = []
245+
for iterable in iterable_of_iterables:
246+
unique_list(iterable, res, seen)
247+
return res
248+
249+
239250
def duplicates(iterable):
240251
"""
241252
List duplicated elements once, preserving order. Remember all elements ever seen.

0 commit comments

Comments
 (0)