编码从unicode到ascii的列表中的字典键

时间:2010-11-29 11:34:30

标签: python django unicode encoding dictionary

我有来自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值。

2 个答案:

答案 0 :(得分:10)

首先:你真的需要这样做吗?这些字符串是Unicode的原因:您根本无法用Unicode表示纯ASCII格式的所有内容。对于你的字典键'uid','name'和'pic_small'来说,这可能不会有问题;但是将它们保留为Unicode可能也不会成为问题。 ('simplejson'库对您的数据一无所知,因此它为每个字符串使用Unicode - 比抱歉更安全。)

反正:

在Python中,无法修改字符串。 .encode方法不会更改字符串;它返回一个新的字符串,即编码版本。

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

看起来像:

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

答案 1 :(得分:5)

你的其他回复暗示了这一点,但是没有说出来: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。