сортировка ключей словаря строчными буквами, прописными буквами и цифрами - PullRequest
1 голос
/ 27 марта 2020

Я хочу отсортировать ключи словаря сначала по цифрам, а затем по буквам в нижнем и верхнем регистре и вернуть их обратно в словарь с правильным значением ключа. Я придумал это, но, на мой взгляд, это слишком долго. (доска - это словарь, который вы хотите отсортировать) пример платы:

board = {
  (3, 4) : 0,
  ("a", 4) : 0,
  (1, 3)  :  0,
  ("X", 5) : 5,
  ("X", 1) : 1
}

Мой вопрос, возможно ли сократить код.

x = []
y = []
for k in dict.keys(board):
    if str(k[0]).islower():
        list.append(x, (k, board[k]))
for k in dict.keys(board):
    if k[0] == "X":
        list.append(y, (k, board[k]))
for k in range(0, len(x)):
    del board[x[k][0]]
for k in range(0, len(y)):
    del board[y[k][0]]
x = sorted(x)
y = sorted(y)
for k in range(0, len(x)):
    board[x[k][0]] = x[k][1]
for k in range(0, len(y)):
    board[y[k][0]] = y[k][1]

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

После сортировки по желаемому порядку, но по кортежу ключа.

Таким образом ('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}
1 голос
/ 27 марта 2020

Вы можете сделать что-то вроде этого:

result = {}
for x in sorted(filter(lambda x: type(x[0]) == int, board.keys())):
  result[x] = board[x]

for x in sorted(filter(lambda x: type(x[0]) == str, board.keys()), key=lambda x: x[0].islower(), reverse=True):
  result[x] = board[x]

>>> result
{(1, 3): 0, (3, 4): 0, ('a', 4): 0, ('X', 5): 5, ('X', 1): 1}

Кроме того, на всякий случай, если вы хотите, чтобы заглавные буквы были перед строчными, и если цифры были длиной всего 1 ди git, то вы могли бы иметь использовал ord для сортировки

>>>sorted(board.keys(), key=lambda x: ord(str(x[0])) if type(x[0]) == int else ord(x[0]))
[(1, 3), (3, 4), ('X', 5), ('X', 1), ('a', 4)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...