如何在Python中将字典值转换为int?

时间:2015-08-10 15:30:35

标签: python sorting dictionary

我有一个程序可以返回一组具有以下等级的域:

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"的值。整数的关键,以便他们正确排序。有什么想法吗?

3 个答案:

答案 0 :(得分:19)

你快到了。您需要在替换,之后将拾取的值转换为整数,如此

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's atoi function,就像这样

>>> 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'}]

答案 1 :(得分:3)

我只想指出数据结构可能会在这里得到改进。你有一个迷你词典列表,但似乎你可以有一个字典,因为" rank"和" url"是隐含的。使用每个唯一的URL作为键,并将该URL的每个等级作为值或计数,这将更好地利用字典的功能恕我直言。如果您将当前数据结构作为其他地方的输出,您可以轻松地将其压缩为更有效的计数器字典,并使用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

答案 2 :(得分:1)

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'}]