сортировка строковых значений в python - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть словарь:

data = {
    'Description': 'test',
    'Amount': '100000',
    'TerminalKey': '1508852342226',
    'OrderId': 'TokenExample',
    'Password': '123456'
}

, и мне нужно получить одну строку отсортированных значений:

'100000testTokenExample1234561508852342226'

Мой код:

data = "".join([v for k, v in sorted(data.items(), key=itemgetter(1))])

выводит это:

'1000001234561508852342226TokenExampletest'

Может кто-нибудь объяснить, почему я получаю другое значение и как я могу получить то, что мне нужно?

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Похоже, вы хотите отсортировать ключи d и затем объединить соответствующие значения.

>>> ''.join(v for k, v in sorted(data.items()))
'100000testTokenExample1234561508852342226'

Это похоже на ответ Оскара, но я предпочитаю не явно указывать "индекс" вДИКТ.

0 голосов
/ 07 декабря 2018

Это потому, что с key=itemgetter(1) вы сортируете по значению .

Для сортировки по ключу, как вы запрашиваете в своем примере, используйте itemgetter(0):

>>> "".join([v for k, v in sorted(data.items(), key=itemgetter(0))])
'100000testTokenExample1234561508852342226'

Обратите внимание, что, просто сортируя кортежи элементов (используя их естественный порядок), вы получаете такую ​​же сортировку:

>>> "".join([v for k, v in sorted(data.items())])
'100000testTokenExample1234561508852342226'
0 голосов
/ 07 декабря 2018

Вы должны отсортировать ключи , а затем соединить соответствующие значения .Пожалуйста, попробуйте:

data = {
 'Description': 'test',
 'Amount': '100000',
 'TerminalKey': '508852342226',
 'OrderId': 'TokenExample',
 'Password': '123456',
}

''.join(data[k] for k in sorted(data))
=> '100000testTokenExample123456508852342226'

Конечно, ваше решение также работает (хотя и немного дольше).Вам просто нужно использовать itemgetter(0) в качестве ключа сортировки, это будет ключ dict :

''.join(v for k, v in sorted(data.items(), key=itemgetter(0)))
=> '100000testTokenExample123456508852342226'

Еще проще: нам даже не нужно явно указывать сортировкуключ, по умолчанию порядок кортежей будет делать именно то, что вы хотите:

''.join(v for k, v in sorted(data.items()))
=> '100000testTokenExample123456508852342226'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...