Here is how I would write this:
def unique(s):
return len(set(s)) == len(s)
Strings are iterable so you can pass your argument directly to set()
to get a set of the characters from the string (which by definition will not contain any duplicates). If the length of that set is the same as the length of the original string then you have entirely unique characters.
Your current approach is fine and in my opinion it is much more Pythonic and readable than the version proposed by the author, but you should change uchars
to be a set instead of a list. Sets have O(1) membership test so c in uchars
will be considerably faster on average if uchars
is a set rather than a list. So your code could be written as follows:
def unique(s):
uchars = set()
for c in s:
if c in uchars:
return False
uchars.add(c)
return True
This will actually be more efficient than my version if the string is large and there are duplicates early, because it will short-circuit (exit as soon as the first duplicate is found).