Как преобразовать значения словаря в int в Python?

У меня есть программа, которая возвращает набор доменов со следующими рангами:

ranks = [
    {'url': 'example.com', 'rank': '11,279'},
    {'url': 'facebook.com', 'rank': '2'},
    {'url': 'google.com', 'rank': '1'}
]

Я пытаюсь отсортировать их по возрастанию с помощью sorted:

results = sorted(ranks,key=itemgetter("rank"))

Однако, поскольку значения «rank» являются строками, сортировка выполняется по алфавиту, а не по возрастанию:

1. google.com: 1

2. example.com: 11,279

3. facebook.com: 2

Мне нужно преобразовать значения только ключа "rank" в целые числа, чтобы они правильно сортировались. Есть идеи?

12 голосов | спросил BaButtons 10 PM00000060000003431 2015, 18:30:34

3 ответа


0

Вы почти у цели. Вам нужно преобразовать выбранные значения в целые числа после замены ,, например, так

results = sorted(ranks, key=lambda x: int(x["rank"].replace(",", "")))

Например,

>>> ranks = [
...     {'url': 'example.com', 'rank': '11,279'},
...     {'url': 'facebook.com', 'rank': '2'},
...     {'url': 'google.com', 'rank': '1'}
... ]
>>> from pprint import pprint
>>> pprint(sorted(ranks, key=lambda x: int(x["rank"].replace(",", ""))))
[{'rank': '1', 'url': 'google.com'},
 {'rank': '2', 'url': 'facebook.com'},
 {'rank': '11,279', 'url': 'example.com'}]

Примечание: я просто использовал функцию pprint, чтобы красиво распечатать результат.

Здесь x будет текущим объектом, для которого key значение определяется. Мы получаем из него значение атрибута rank, заменяем , с пустой строкой, а затем преобразовал ее в число с помощью int.


Если вы не хотите заменять , и правильно обрабатывать его, тогда вы можете использовать locale модуля atoi функция , вот так

>>> import locale
>>> pprint(sorted(ranks, key=lambda x: int(locale.atoi(x["rank"]))))
[{'rank': '1', 'url': 'google.com'},
 {'rank': '2', 'url': 'facebook.com'},
 {'rank': '11,279', 'url': 'example.com'}]
ответил thefourtheye 10 PM00000060000002431 2015, 18:32:24
0

Я просто хочу отметить, что структура данных здесь потенциально может быть улучшена. У вас есть список мини-словарей, но кажется, что у вас может быть один словарь, так как «rank» и «url» неявные. Используйте каждый уникальный URL-адрес в качестве ключа и каждый ранг для этого URL-адреса в качестве значения или счетчика, что будет лучше использовать возможности словаря IMHO. Если вы получаете текущую структуру данных в качестве выходных данных откуда-то еще, вы можете легко сжать ее в более эффективный словарь счетчиков с преобразованием в целочисленные ранги в качестве значений, используя dict() функция:

>>> ranks
[{'url': 'example.com', 'rank': '11,279'}, {'url': 'facebook.com', 'rank': '2'}, {'url': 'google.com', 'rank': '1'}]
>>> compressed = dict([(x['url'], int(x['rank'].replace(',', ''))) for x in ranks])
>>> compressed
{'facebook.com': 2, 'google.com': 1, 'example.com': 11279}

Если у вас будет много данных, они будут более компактными и интуитивно понятными для работы. Вы можете легко использовать это для хороших распечаток на основе рангов:

>>> print ''.join(['{k:>12}: {v:,}\n'.format(k=item[0], v=item[1]) for item in sorted(compressed.items(), key=lambda i: i[1])])
  google.com: 1
facebook.com: 2
 example.com: 11,279
ответил isosceleswheel 10 PM00000070000003631 2015, 19:03:36
0
x=[{'url': 'example.com', 'rank': '11,279'}, {'url': 'facebook.com', 'rank': '2'}, {'url': 'google.com', 'rank': '1'},{'url': 'google.com', 'rank': '11,280'},{'url': 'google.com', 'rank': '12'}]

results = sorted(x,key=lambda k:ast.literal_eval(k.get("rank").replace(",","")))
print [i for i in results]

Полагаю, вам следует использовать ast.literal.eval, а затем сравнить, чтобы быть точным и точным.

Вывод: [{'url': 'google.com', 'rank': '1'}, {'url': 'facebook.com', 'rank': '2'}, {'url': 'example.com', 'rank': '11,279'}, {'url': 'google.com', 'rank': '11,280'}, {'url': 'google.com', 'rank': '12'}]

ответил vks 10 PM00000060000002731 2015, 18:44:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132