Python如何比较Unicode字符串和普通字符串?
我在网上查了很多资料,试着用.encode(...)来处理这个字符串,但我觉得这个问题可能没有看起来那么严重。
我有两个数据结构,一个是从YAML文件加载的,另一个是从JSON文件加载的。
这两个内容都经过处理(我在遍历这些数据):
YAML的字典
[{'SynID': 66, 'action': 'userInit', 'appLocation': 0},
{'SynID': 66, 'action': 'isEngager', 'appLocation': 0}]
JSON的字典
{u'name': u'SynID', u'value': u'66'}
...
{u'name': u'action', u'value': u'isEngager'}
最后,在进行比较时,任何涉及整数(非字符串)的部分都失败了。例如:
if uriDict['name'] in expectedResultsSubDict and uriDict['value'] == expectedResultsSubDict[uriDict['name']]:
Logger().l("[%s] Match: %s:%s == %s" % (pos, uriDict['name'], uriDict['value'], expectedResultsSubDict[uriDict['name']]))
elif uriDict['name'] in expectedResultsSubDict:
Logger().l("[%s] Name: %s, value: %s" % (pos, uriDict['name'], uriDict['value']))
第一个if语句无法匹配键值对SynID:66,但可以匹配第二个条目,action:isEngager。
2013-01-28 12:48:42,151 : DEBUG : [0] Name: SynID, value: 66
2013-01-28 12:48:42,151 : DEBUG : [0] Match: action:userInit == userInit
从输出中可以看到,它没有匹配SynID,但匹配了action。
如果我加上这一行:
elif uriDict['name'] in expectedResultsSubDict and int(uriDict['value']) == int(expectedResultsSubDict[uriDict['name']]):
Logger().l("[%s] Int Match: %s:%s == %s" % (pos, uriDict['name'], uriDict['value'], expectedResultsSubDict[uriDict['name']]))
它在SynID(以及其他整数字段)上能正常工作,但在字符串字段上却失败了。我还尝试把'=='比较改成'is',结果什么都没匹配上。
问)我该如何比较我的字典值?
2 个回答
0
这里没有关于unicode字符串的问题:你是在比较一个字符串和一个整数,所以结果是False,因为一个是字符串,另一个是整数。
你可以用 int(my_value_which_is_string_or_number)
把一个值转换成整数。
2
你在比较66和'66',它们是不相等的——一个是整数,另一个是字符串。Python不自动转换不同类型的数据,因为它的原则是“明确比隐含好”。要让它们能比较,你需要先把它们都转换成字符串,然后再进行比较,像这样:
if uriDict['name'] in expectedResultsSubDict and str(uriDict['value']) == str(expectedResultsSubDict[uriDict['name']]):