将列表中字典的键从Unicode编码转换为ASCII编码

4

我有一份从Facebook获取的好友列表样例响应:

[{u'uid': 513351886, u'name': u'Mohammed Hossein', u'pic_small': u'http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs643.snc3/27383_513351886_4933_t.jpg'},
    {u'uid': 516583220, u'name': u'Sim Salabim', u'pic_small': u'http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs348.snc4/41505_516583220_5681339_t.jpg'}]

我应该如何解析这个列表中字典的编码键为ascii?我尝试了以下代码:
response = simplejson.load(urllib.urlopen(REST_SERVER, data))
for k in response:
    for id, stuff in k.items():
        id.encode("ascii")
        logging.debug("id: %s" % id)
return response

但是编码的键没有被保存,因此我仍然得到Unicode值。


1
为什么需要对它们进行编码? - Ignacio Vazquez-Abrams
对于想要编码键和值的人:https://dev59.com/eHM_5IYBdhLWcg3wt1vD#1254499 - benathon
2个回答

11

首先,你真的需要这么做吗?字符串使用Unicode是有原因的:你不能用纯ASCII表示Unicode可以表示的所有内容。对于字典键'uid'、'name'和'pic_small'来说,这可能不是问题;但将它们保留为Unicode也不会有问题。('simplejson'库不了解你的数据,因此对于每个字符串都使用Unicode - 宁愿安全也不要冒险。)

无论如何:

在Python中,字符串是不可修改的。 .encode方法并不改变字符串本身,而是返回编码后的新字符串。

你想要做的是生成一个新的字典,其用编码后的键替换原始键。我们可以通过将每个(编码后的键,原始值)对作为*args传递给dict构造函数来实现这一点。

代码看起来像:

dict((k.encode('ascii'), v) for (k, v) in original.items())

同样地,我们可以使用列表推导式将其应用到每个字典,并创建新的列表。(虽然我们可以直接修改原始列表,但这种方法更清晰易懂。)

response = simplejson.load(urllib.urlopen(REST_SERVER, data))
# We create the list of modified dictionaries, and re-assign 'response' to it:
response = [
     dict((k.encode('ascii'), v) for (k, v) in original.items()) # the modified version
     for original in response # of each original dictionary.
]
return response

在更现代的 Python 版本中,支持字典推导式,我们可以这样做:response = [{k.encode('ascii'): v for k, v in original.items()} for original in response] - Karl Knechtel

6

你的其他回答已经暗示了这一点,但没有明确说明:在Python中进行字典查找和字符串比较时,会自动转换Unicode和ASCII编码:

>>> x = {u'foo':'bar'}    # unicode key, ascii value
>>> x['foo']              # look up by ascii
'bar'
>>> x[u'foo']             # or by unicode
'bar'
>>> x['foo'] == u'bar'    # ascii value has a unicode equivalent
True

对于从JSON转换得到的字典的大多数用途,您通常不需要担心一切都是Unicode的事实。


谢谢,这就是我在寻找的答案! - Mingwei Zhang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接