【问题标题】:How to convert dictionary values to int in Python?如何在 Python 中将字典值转换为 int?
【发布时间】:2015-11-02 14:28:43
【问题描述】:

我有一个程序可以返回一组具有如下排名的域:

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”键的值转换为整数,以便它们能够正确排序。有什么想法吗?

【问题讨论】:

  • 如果您可以自己创建字典,请选择整数而不是字符串。

标签: python sorting dictionary


【解决方案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'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'}]

【讨论】:

  • 我还有一个问题:由于 OP 实际上要求将值转换为 int 以便他可以正确排序,那么他的问题是我猜的排序,而不是类型。难道他不能在替换 , 后对值进行排序并期望相同的结果,而不将它们转换为整数吗?
  • @tomasyany: 是的,但这种排序将是字典顺序的,而不是数字的,'11' < '9' 即使11 > 9
  • 使用locale.atoi 如上所述我得到ValueError: invalid literal for int() with base 10: '11,279'
  • @RolfofSaxony:是不是因为萨克森州的千位分隔符是"."? (实际上这可能不是原因,即使它是真的:这是因为默认语言环境中没有 THOUSEP。但无论如何,使用特定于语言环境的函数来解析不是特定于语言环境的格式的数据是一个麻烦的世界)
  • @Steve Jessop:不,事实并非如此。我只是指出如果没有正确设置语言环境,使用 locale.atoi 将不会自动工作。而替换选项不会遇到同样的问题。
【解决方案2】:
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'}]

【讨论】:

  • 这不是把 11279 变成 11.279 我知道数字中点和逗号的使用因国家而异,这可能是个问题
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多