# Hash states to be able to compare them

## Question:

I have these two states that represent the same state, but with changed order, with Python:

```
state1 = [ [1,5,6], [8,2,1] ]
state2 = [ [8,2,1], [1,5,6] ]
```

How can I hash these two states to be able to compare them? (state1 == state2)

## Answers:

I would do it like this:

```
>>> from collections import Counter
>>> def my_hash(state):
... counter = Counter(map(tuple, state))
... items = frozenset(counter.items())
... return hash(items)
...
>>> my_hash(state1) == my_hash(state2)
True
```

Just to be able to compare them, you don’t need to hash them. For example, `set`

s support unordered comparisons. You just need to make the sublists hashable first, which you can do by converting them to `tuple`

s:

```
def state_comparable(state: list[list[int]]) -> set[tuple[int]]:
return {tuple(sub) for sub in state}
```

```
>>> state_comparable(state1) == state_comparable(state2)
True
```

But if you do need to hash them, you can simply swap `set`

for `frozenset`

:

```
def state_hash(state: list[list[int]]) -> int:
return hash(frozenset(tuple(sub) for sub in state))
```

```
>>> state_hash(state1) == state_hash(state2)
True
```

**Note**: These solutions assume the sublists are always unique. Otherwise, see wim’s answer for how to use a `Counter`

.

the easiest:

```
sorted(state1) == sorted(state2)
```

It may be more correct to convert to set, But then the list inside the list needs to be converted to a tuple:

```
state1 = [ [1,5,6], [8,2,1] ]
state2 = [ [8,2,1], [1,5,6] ]
s1 = set(tuple(i) for i in state1)
s2 = set(tuple(i) for i in state2)
s1 == s2
```