Python如何比较Unicode字符串和普通字符串?

0 投票
2 回答
1625 浏览
提问于 2025-04-17 13:58

我在网上查了很多资料,试着用.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']]):

撰写回答