如何将字符串与unicode字典进行比较?

时间:2015-05-08 06:15:22

标签: python dictionary

好的,我正在尝试做的是每当工作中的服务器出现故障时,我会收到一封电子邮件,通知我它已经关闭,还有其他一些信息。我正在尝试做的是写一些东西来拉动服务器的关键性(经常变化)并根据其重要性采取特定的行动。所以我所做的就是获取包含所有信息的excel文档,并用它创建了一个字典。密钥都是服务器名称,值是它们的关键性。然后我尝试将电子邮件中的服务器名称与字典进行比较,以提取服务器的关键性。这里有一些印刷语句及其结果。

print server_name
print server_list
print server_name in [server_list]

我明白了:

ABC123
{'': '', u'ABC123': u'High':''}
False

我仍然是python的新手,但是当我检查server_name是否在server_list中时,我认为我得到了False,因为我正在尝试将字符串与unicode进行比较。所以我尝试将字符串转换为unicode,但它仍然无法工作(尝试通过使用类型(server_name)进行验证,以确保它们都是相同的类型)。

现在这是我的代码的更大部分:

    email_subject = str(messages.GetLast())
    period = email_subject.find('.')
    period = int(period)
    server_name = email_subject[0:period]
    server_name = str(server_name.upper())
    if server_name in [server_list]:
        print 'server name is found in the server list'

    elif server_name not in [server_list]:
        print 'server name is not found in the server list'
        criticality = server_list[server_name]
        print server_name
        print criticality

这给了我输出:

ABC123
High

因此,当我运行此部分时,因为我的'if'语句为False,所以它运行我的elif语句,即True。然后它会正确打印出服务器名称以及关键性。我不明白的是为什么我找不到字典中的密钥,但我可以拉出我找不到的密钥值?此外,如果我从

更改我的'if'语句
if server_name in [server_list]

if server_name not in [server_list]

我可以让它按照我想要的方式运行,但是我真的很难理解我为什么会那样工作。

2 个答案:

答案 0 :(得分:2)

这与unicode无关。

  1. 您的server_list实际上是一本字典。
  2. 当您说server_name in [server_list]时,您将词典放入列表(即它变为[{'': '', u'ABC123': u'High':''}]),然后查看server_name是否在名单。它不是,因为它是一个字符串。
  3. 您只需将测试更改为:if server_name in server_list,而不包括周围的括号 此外,最好将其重命名为server_dict

    只是为了说明:

    my_dict = {'ABC': True}
    'ABC' in [my_dict]  # False
    'ABC' in my_dict  # True
    

答案 1 :(得分:1)

我认为你的问题在这里:

if server_name in [server_list]:

如果server_list有类型列表,您应该按如下方式使用它:

if server_name in server_list:

检查此示例:

>>> lst = ['this', 'is', 'example']
>>> 'is' in lst
True
>>> 'is' in [lst]
False

更新:另外,为了您自己的安全,请考虑将所有字符串值转换为小写,因为'是'和'是'是不同的字符串。