I have a list named CB whose elements are also lists, how to keep only the unique elements of CB? np.unique() or list(set()) do not work

Question:

I have a very long list named CB with possibly repeated elements. For example, CB could be [[0, 0], [0, 1], [0, 2], [0, 1], [1, 1], [1, 2], [0, 2], [1, 2], [2, 2]]. Each element in CB is a list of sorted numbers.

In this example, I want to keep
[[0,0], [0,1], [0,2], [1,1], [1,2], [2,2]].

I’ve tried to use CB1=np.unique(CB), but it returns [0,1,2], which is not what I wanted.
I also tried to use CB1=list(set(CB)), but got the following error: TypeError: unhashable type: ‘list’.

How to solve this problem? It would be great if you could solve it with the simplest possible code. A python function or one line of code would be awesome. Thanks!

Asked By: ExcitedSnail

||

Answers:

If you use np.unique, you want to use the axis keyword argument:

data = [[0, 0], [0, 1], [0, 2], [0, 1], [1, 1], [1, 2], [0, 2], [1, 2], [2, 2]]
np.unique(data, axis=0)

array([[0, 0],
       [0, 1],
       [0, 2],
       [1, 1],
       [1, 2],
       [2, 2]])

if you want to use set, you need to convert to hashable type, e.g. tuple:

data = map(tuple, data)
set(data)

{(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)}

if you need then converted back to the original list type, then the complete 1-liner would be:

data = list(map(list,set(map(tuple, data))))
Answered By: Julien
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.