我有一个程序可以返回一组具有以下等级的域:
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"的值。整数的关键,以便他们正确排序。有什么想法吗?
答案 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'}]