在python字典中使用unicode键

在python字典中使用unicode键,python,twitter,dictionary,unicode,Python,Twitter,Dictionary,Unicode,我正在学习使用Python2.7.x的Twitter API。我已经保存了一些随机推文,我正在尝试处理它们。每个tweet都会转换为一个带有json.loads的字典,所有字典都是列表的一部分 给定一条tweet,我希望能够从字典中提取某些字段。这些键都是unicode字符串。如果我在循环中遍历键,则打印值不会有问题: for i in tweet.keys(): print i, tweet[i] 所以上面的循环工作得很好,但我没有幸运地弄明白如何手动指定密钥。“u'text'”是实

我正在学习使用Python2.7.x的Twitter API。我已经保存了一些随机推文,我正在尝试处理它们。每个tweet都会转换为一个带有json.loads的字典,所有字典都是列表的一部分

给定一条tweet,我希望能够从字典中提取某些字段。这些键都是unicode字符串。如果我在循环中遍历键,则打印值不会有问题:

for i in tweet.keys():
    print i, tweet[i]
所以上面的循环工作得很好,但我没有幸运地弄明白如何手动指定密钥。“u'text'”是实际tweet内容(用户的实际帖子)的键。如果我试图打印tweet['text'],我会得到一个键错误。我天真地尝试了tweet[u'text],但也失败了,出现了一个关键错误


我想我很好奇循环在通过tweet.keys()时所做的事情与手动指定键时所做的事情之间的区别。请注意,如果我在上面的循环中打印I的值,则会打印密钥名,但不会使用unicode包装。当键为“u'text”时,i的值仅为“text”,或者至少是打印到终端的值。

Python 2为您透明地处理
str
unicode
键之间的转换,前提是文本可以编码为ASCII:

>>> d = {u'text': u'Foo'}
>>> d.keys()
[u'text']
>>> 'text' in d
True
>>> u'text' in d
True
>>> d['text']
u'Foo'
>>> d[u'text']
u'Foo'

这意味着如果你在tweet['text']中得到了一个
KeyError
,那么该字典就没有这样的键。

为什么不在testDict.items()中为key,elem做些什么呢:print key,elemsence
'text'==u'text'
(python在这里根据需要隐式编码/解码),这仅仅意味着你的字典里没有这个键,不同的是你在看不同的字典。没有
'text'
键的。请注意,在python3中这是不同的,在python3中比较
b'text'!='文本“
不是偶数allowed@wim:但也不会显示带有
u
前缀的unicode字符串。在我的例子中,我正在迭代从twitter流中提取的随机推文列表。我只对实际发布的和原创的信息感兴趣,而不是重新发布的推文、其他非推文帖子等,但我并没有过滤掉这些信息。为@MartijnPieters干杯,让我头脑清醒。最后一条语句令人困惑,或者它仍然受到限制,前提是文本可以编码为ASCII。给定
d={u“ä”:1}
您会得到一个与
d[“ä”]
相反的关键错误。我的结论是:如果您不知道查询值是否是ASCII可编码的,则必须将键和查询值都转换为
str
unicode
(如果您希望它们匹配)。@bluenote10:
'text'
是ASCII。然而,并非他们的所有数据都包含该键。@bluenote10:请注意,我的答案以开头,前提是文本可以编码为ASCII:@bluenote10:最后但并非最不重要的一点是,OP假设他们保存的所有词典都有一个
text
键,然后在没有重新考虑他们的假设的情况下误解了异常。虽然这可能回答了作者的问题,但它缺少一些解释性的词语和文档链接。如果没有一些短语,原始代码片段就没有多大帮助。你也会发现这很有帮助。请编辑您的答案。
Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> d = {u'text': u'Foo'}
>>> print "d:{text}".format(**d)
d:Foo