2

*edit

I make

word=['I','love','hello','world','love','I']

when I convert to set, It change the order to

print(set(word))
output: {'world', 'I', 'hello', 'love'}

How to sort the set again to be

{'I', 'love', 'hello', 'world'}

2 Answers2

4

Sets are unordered. If you want order, convert back to a list.

E.g.

print(sorted(set(word)))

sorted will sort your items and return a list.

However, if you want to retain the order of your elements rather than sort them, you can use a set for deduplication and a list for ordering, something like this:

def unique(items):
    seen = set()
    result = []
    for item in items:
        if item not in seen:
            seen.add(item)
            result.append(item)
    return result

and use it as:

>>> word = ['I','love','hello','world','love','I']
>>> print(unique(word))
['I', 'love', 'hello', 'world']
khelwood
  • 55,782
  • 14
  • 81
  • 108
2

If you just want an ordered collection of unique values, you can create a dict from the list, either with a dict comprehension or dict.fromkeys. In Python 3, dictionaries will retain insertion order; for older versions, use collections.OrderedDict. The dict will have values besides the keys, but you can just ignore those.

>>> word = ['a','b','c','c','b','e']
>>> {k: None for k in word}
{'a': None, 'b': None, 'c': None, 'e': None}
>>> dict.fromkeys(word)
{'a': None, 'b': None, 'c': None, 'e': None}

Other than sorted, this also works if the original order is different than the sorted order.

>>> word = ['f','a','b','c','c','b','e']
>>> dict.fromkeys(word)
{'f': None, 'a': None, 'b': None, 'c': None, 'e': None}

You can then either convert the result to list or keep it a dict and add more values, but if you make it a set, the order will be lost again. Like a set, the dict also allows fast O(1) lookup, but no set operations like intersection or union.

tobias_k
  • 81,265
  • 12
  • 120
  • 179