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

标签 python django unicode encoding dictionary

我有来自 facebook 的 friend 列表的示例响应:

[{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

但编码后的 key 没有保存,因此我仍然得到 unicode 值。

最佳答案

首先:您真的需要这样做吗?字符串使用 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

关于python - 将列表中的字典键从 unicode 编码为 ascii,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4303324/

相关文章:

python - 为什么 PyQt 中的这段代码允许我不选中所有单选按钮?

python - 如何在一行中显示多个字段? (Django 管理员)

python - 从 Django 中的 FilteredSelectMultiple 小部件获取所选值

python - 无法访问instancemethod属性?

java - 有没有办法用 Java 检查 .txt 文件的字符集编码?

macos - 如何阻止 Emacs 回退到光栅化的 Unicode 字符?

python - GridFS (MongoDB) 的自定义存储系统?

python 2.7 异步函数与 tkinter

python - 根据 QLabel 包含的文本自动调整 QLabel 的大小

python - 在 Python 中使用 BOM 字符读取 Unicode 文件数据