diff --git a/modules/base/pymod/table.py b/modules/base/pymod/table.py index 12509583a90ae6e483cffe2d817d718dae450729..43a94db670535e5dfed9b2f964229c7c34133875 100644 --- a/modules/base/pymod/table.py +++ b/modules/base/pymod/table.py @@ -508,6 +508,21 @@ class Table: return sign*cmp(lhs[key_index], rhs[key_index]) self.rows=sorted(self.rows, _key_cmp) + def GetUnique(self, col, ignore_nan=True): + """ + Extract a list of all unique values from one column + """ + idx = self.GetColIndex(col) + seen = {} + result = [] + for row in self.rows: + item = row[idx] + if item!=None or ignore_nan==False: + if item in seen: continue + seen[item] = 1 + result.append(item) + return result + def Zip(self, *args): """ Allows to conveniently iterate over a selection of columns, e.g. diff --git a/modules/base/tests/test_table.py b/modules/base/tests/test_table.py index f83b9512c5803fae95c96cb1f2bc84a0b6050f36..f41418193b943e309bb0930c2448e4e84bab4e5d 100644 --- a/modules/base/tests/test_table.py +++ b/modules/base/tests/test_table.py @@ -1130,6 +1130,17 @@ class TestTable(unittest.TestCase): self.assertFalse(tab.IsEmpty('a', ignore_nan=False)) self.assertFalse(tab.IsEmpty('b', ignore_nan=False)) self.assertFalse(tab.IsEmpty('c', ignore_nan=False)) + + def testUnique(self): + tab = self.CreateTestTable() + tab.AddRow(['foo',4, 3.3]) + tab.AddRow([None,5, 6.3]) + self.assertEquals(tab.GetUnique('first'), ['x','foo']) + self.assertEquals(tab.GetUnique('first', ignore_nan=False), ['x','foo', None]) + self.assertEquals(tab.GetUnique('second'), [3,9,4,5]) + self.assertEquals(tab.GetUnique('second', ignore_nan=False), [3,None,9,4,5]) + self.assertEquals(tab.GetUnique('third'), [2.2, 3.3, 6.3]) + self.assertEquals(tab.GetUnique('third', ignore_nan=False), [None, 2.2, 3.3, 6.3]) if __name__ == "__main__": try: