Как преобразовать значения словаря в 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
Мне нужно преобразовать значения только ключа "ранга" в целые числа, чтобы они правильно сортировались. Любые идеи?
Ответы
Ответ 1
Ты почти там. Вам нужно преобразовать выбранные значения в целые числа после замены ,
, как этот
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
module 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'}]
Ответ 2
Я просто хочу указать, что структура данных может быть здесь улучшена. У вас есть список мини-словарей, но кажется, что у вас может быть один словарь, так как "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
Ответ 3
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'}]