正确比较列表和词典

时间:2015-08-28 16:43:32

标签: python python-2.7 dictionary

我试图将列表与字典的值进行比较,然后以不同的方式打印出比较。

我正在以这种格式列出一个列表:

list_1 = ['hostname ipaddress', 'hostname ipaddress']

然后我将它拆分成字典:

new_dict = {'hostname': 'ipaddress', etc}

我正在另外列出'感兴趣的项目':

list_interest = ['hostname', 'hostname']

与字典键值进行比较。如果匹配,我想用特殊格式打印匹配的项目,如果没有匹配,只需打印正常格式的项目。

目前,我只是想让print 'yes'print item确保逻辑有效。但是你可以看到我的思维过程无效。我想有更好的方法来处理这个问题?我理解为什么我会得到重复,我只是不确定如何处理它。

测试代码

new_dict = dict((x.split(' ') for x in list_1))
for item in new_dict:
    for interest in list_interest:
        if new_dict.has_key(interest):
            print "yes" 
        else:
            print "\t", item

代码输出

hostname1
hostname1
hostname1
yes
hostname2
hostname2
etc

工作代码之后,参加Martijn Pieters的初步示例。

new_dict = dict((x.split(' ') for x in list_1))
    for item in new_dict:
        if item in interest:
            print "yes" 
        else:
            print "\t", item, new_dict[item]

3 个答案:

答案 0 :(得分:3)

同时在字典上循环时,您的循环和测试项目过于复杂。

只测试密钥是否在列表中:

new_dict = dict((x.split(' ') for x in list_1))
for item in new_dict:
    if item in list_interest:
        print "yes" 
    else:
        print "\t", item

那里的成员资格测试(item in list_interest)将遍历列表以查看其中是否存在等于它的值。这不是那么有效,你可以在这里使用 set 进行O(1)恒定时间测试:

new_dict = dict((x.split(' ') for x in list_1))
set_interest = set(list_interest)
for item in new_dict:
    if item in set_interest:
        print "yes"
    else:
        print "\t", item

演示:

>>> list_1 = ['hostname1 ipaddress1', 'hostname2 ipaddress2', 'hostname3 ipaddress3']
>>> list_interest = ['hostname1', 'hostname3']
>>> new_dict = dict((x.split(' ') for x in list_1))
>>> set_interest = set(list_interest)
>>> for item in new_dict:
...     if item in set_interest:
...         print "yes" 
...     else:
...         print "\t", item
... 
yes
    hostname2
yes

答案 1 :(得分:1)

您正在使用key中的每个值检查每个list_interest值。

假设在分割后这是你的dict ..

new_dict = {'hostname1': 'ip1', 'hostname2': 'ip2', 'hostname3': 'ip3'}

并且您的list_interest是..

list_interest = ['hostname1', 'hostname4']

你的逻辑是这样做的...(我刚刚逃过if condition来帮助你理解循环中发生的事情)

for item in new_dict:
    for interest in list_interest:
        print interest, item

输出:

hostname1 hostname1
hostname4 hostname1
hostname1 hostname2
hostname4 hostname2
hostname1 hostname3
hostname4 hostname3

因此,无需迭代list_interest,您只需iterate超过new_dict并检查list_interest中是否存在值。

for item in new_dict:
    if item in list_interest:
        print 'yes'
    else:
        print item

这将为您提供您所寻找的确切结果!

答案 2 :(得分:0)

dict_name = {1: '1', 2: '2', 3: '3'}
list_name = ['1', '2', '4']
dict_name_values = list(dict_name.itervalues())
diff = list(set(dict_name_values).difference(set(list_name)))
# or
diff = list(set(list_name).difference(set(dict_name_values)))

你需要确定你想要区别于哪种感觉,因为差异是一次只为两组中的一组确定的。

这里是文档:https://docs.python.org/2/library/stdtypes.html#set.difference