0

我四处搜索并尝试对字符串进行 .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 不匹配,但与操作匹配。

如果我在这一行中添加:

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',在这种情况下,没有任何匹配项。

问)我如何比较我的字典的值?

4

2 回答 2

2

您将 66 与 '66' 进行比较,它们不相等 - 一个是 int,一个是字符串。Python 不会在类型之间进行隐式转换,因为它的理念是“显式优于隐式”。为了让它工作,我会先将两者都转换为字符串,然后进行比较,就像这样

if uriDict['name'] in expectedResultsSubDict and str(uriDict['value']) == str(expectedResultsSubDict[uriDict['name']]):
于 2013-01-28T18:03:03.073 回答
0

这里的 unicode 字符串没有问题:您将字符串与整数进行比较,结果为 False,因为嗯,其中一个是字符串,另一个是整数。

您可以使用 将值转换为整数int(my_value_which_is_string_or_number)

于 2013-01-28T18:02:11.250 回答