После сортировки по желаемому порядку, но по кортежу ключа.
Таким образом ('X', 1) должно быть раньше ('X', 5), потому что первые элементы равны, поэтому зависит от второго элемента .
Процедура сортировки
def sort_dict(d):
def ordering(i):
"""Create ordering so that numbers are before strings
lowercase strings are before upper case strings"""
return ([isinstance(i, int), isinstance(i, str) and i.islower(), isinstance(i, str) and i.isupper()].index(True), i)
# By applying ordering to all elements of key, we create a new tuple
# which allows us to compare
return dict(sorted(d.items(), key=lambda kv: tuple(map(ordering, kv[0]))))
Тест
board = {(3,4):0,("a",4):0,(1,3):0,("X",5):5,("X",1):1}
print(sort_dict(board))
Выход
{(1, 3): 0, (3, 4): 0, ('a', 4): 0, ('X', 1): 1, ('X', 5): 5}