0

文字列を検索して.encode(...)しようとしましたが、この問題が思ったほど深刻であるとは想像できません。

2つのデータ構造があります。1つはYAMLファイルから読み込まれ、もう1つは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のキー/値と一致しませんが、2番目のエントリ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(およびintを持つ他のフィールド)では正しく機能しますが、文字列フィールドでは失敗します。また、「==」の比較を「is」に変更してみましたが、その場合、一致するものはありませんでした。

Q)辞書の値を比較するにはどうすればよいですか?

4

2 に答える 2

2

66と'66'を比較していますが、これらは等しくありません。1つはintで、もう1つは文字列です。Pythonは、「明示的は暗黙的よりも優れている」という哲学のため、型間の暗黙的な変換を行いません。それを機能させるために、私は最初に両方を文字列に変換してから比較します。

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

ここではUnicode文字列に問題はありません。文字列を整数と比較していて、Falseを取得しているのは、そのうちの1つが文字列でもう1つが整数だからです。

を使用して、値を整数に変換できますint(my_value_which_is_string_or_number)

于 2013-01-28T18:02:11.250 に答える