Подтвердить что ты не робот

Как преобразовать значения словаря в 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

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

4b9b3361

Ответ 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'}]