Skip to content

Commit 56219ff

Browse files
committed
util.get_unique_names: Add more flexible arguments
1 parent f2ec533 commit 56219ff

File tree

2 files changed

+76
-8
lines changed

2 files changed

+76
-8
lines changed

Orange/data/tests/test_util.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import unittest
2+
3+
from Orange.data import Domain, ContinuousVariable
4+
from Orange.data.util import get_unique_names
5+
6+
7+
class TestGetUniqueNames(unittest.TestCase):
8+
def test_get_unique_names(self):
9+
names = ["foo", "bar", "baz", "baz (3)"]
10+
self.assertEqual(get_unique_names(names, ["qux"]), ["qux"])
11+
self.assertEqual(get_unique_names(names, ["foo"]), ["foo (1)"])
12+
self.assertEqual(get_unique_names(names, ["baz"]), ["baz (4)"])
13+
self.assertEqual(get_unique_names(names, ["baz (3)"]), ["baz (3) (1)"])
14+
self.assertEqual(
15+
get_unique_names(names, ["qux", "quux"]), ["qux", "quux"])
16+
self.assertEqual(
17+
get_unique_names(names, ["bar", "baz"]), ["bar (4)", "baz (4)"])
18+
self.assertEqual(
19+
get_unique_names(names, ["qux", "baz"]), ["qux (4)", "baz (4)"])
20+
self.assertEqual(
21+
get_unique_names(names, ["qux", "bar"]), ["qux (1)", "bar (1)"])
22+
23+
self.assertEqual(get_unique_names(names, "qux"), "qux")
24+
self.assertEqual(get_unique_names(names, "foo"), "foo (1)")
25+
self.assertEqual(get_unique_names(names, "baz"), "baz (4)")
26+
27+
def test_get_unique_names_with_domain(self):
28+
a, b, c, d = map(ContinuousVariable, ["foo", "bar", "baz", "baz (3)"])
29+
domain = Domain([a, b], c, [d])
30+
self.assertEqual(get_unique_names(domain, ["qux"]), ["qux"])
31+
self.assertEqual(get_unique_names(domain, ["foo"]), ["foo (1)"])
32+
self.assertEqual(get_unique_names(domain, ["baz"]), ["baz (4)"])
33+
self.assertEqual(get_unique_names(domain, ["baz (3)"]), ["baz (3) (1)"])
34+
self.assertEqual(
35+
get_unique_names(domain, ["qux", "quux"]), ["qux", "quux"])
36+
self.assertEqual(
37+
get_unique_names(domain, ["bar", "baz"]), ["bar (4)", "baz (4)"])
38+
self.assertEqual(
39+
get_unique_names(domain, ["qux", "baz"]), ["qux (4)", "baz (4)"])
40+
self.assertEqual(
41+
get_unique_names(domain, ["qux", "bar"]), ["qux (1)", "bar (1)"])
42+
43+
self.assertEqual(get_unique_names(domain, "qux"), "qux")
44+
self.assertEqual(get_unique_names(domain, "foo"), "foo (1)")
45+
self.assertEqual(get_unique_names(domain, "baz"), "baz (4)")
46+
47+
48+
if __name__ == "__main__":
49+
unittest.main()

Orange/data/util.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
Data-manipulation utilities.
33
"""
44
import re
5+
from itertools import chain
6+
57
import numpy as np
68
import bottleneck as bn
79
from scipy import sparse as sp
@@ -139,15 +141,32 @@ def get_indices(names, name):
139141

140142
def get_unique_names(names, proposed):
141143
"""
142-
Returns unique names of variables. Variables which are duplicate get appended by
143-
unique index which is the same in all proposed variable names in a list.
144-
:param names: list of strings
145-
:param proposed: list of strings
146-
:return: list of strings
144+
Returns unique names for variables
145+
146+
Proposed is a list of names (or a string with a single name). If any name
147+
already appears in `names`, the function appends an index in parentheses,
148+
which is one higher than the highest index at these variables.
149+
150+
If argument `names` is domain, the method observes all variables and metas.
151+
152+
Function returns a string if `proposed` is a string, and a list if it's a
153+
list.
154+
155+
Args:
156+
names (Domain or list of str): used names
157+
proposed (str or list of str): proposed name
158+
159+
Return:
160+
str or list of str
147161
"""
148-
if len([name for name in proposed if name in names]):
149-
max_index = max([max(get_indices(names, name),
150-
default=1) for name in proposed], default=1)
162+
from Orange.data import Domain # prevent cyclic import
163+
if isinstance(names, Domain):
164+
names = [var.name for var in chain(names.variables, names.metas)]
165+
if isinstance(proposed, str):
166+
return get_unique_names(names, [proposed])[0]
167+
if set(proposed) & set(names):
168+
max_index = max(max(get_indices(names, name), default=0)
169+
for name in proposed)
151170
for i, name in enumerate(proposed):
152171
proposed[i] = "{} ({})".format(name, max_index + 1)
153172
return proposed

0 commit comments

Comments
 (0)