Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将列表中字典的键从unicode编码为ascii_Python_Django_Unicode_Encoding_Dictionary - Fatal编程技术网

Python 将列表中字典的键从unicode编码为ascii

Python 将列表中字典的键从unicode编码为ascii,python,django,unicode,encoding,dictionary,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://prof

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

首先:您真的需要这样做吗?字符串使用Unicode是有原因的:您不能像使用Unicode那样用普通ASCII表示所有内容。对于字典键“uid”、“name”和“picu-small”,这可能不会有问题;但将它们作为Unicode也可能不会有问题。(simplejson库对您的数据一无所知,因此它对每个字符串都使用Unicode,这比“抱歉”更安全。)

无论如何:

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

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

这看起来像:

dict((k.encode('ascii'), v) for (k, v) in original.items())
类似地,我们可以使用列表理解将其应用于每个字典,并创建新的列表。(我们可以在适当的位置修改列表,但这种方式更简洁。)


您的其他回答暗示了这一点,但不要说出来: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这一事实。

为什么需要对它们进行编码?对于希望对键和值进行编码的人:在支持dict理解的更现代的Python版本中,我们可以这样做:
response=[{k.encode('ascii')):v代表k,v代表原始。items()}代表原始响应]
。谢谢,这就是我搜索的答案!
>>> 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