2015-08-28 5 views
0

Я пытаюсь сравнить список со значением словаря, а затем распечатать сравнение по-разному с остальными.Сравнение списков и словарей правильно

Я беру список в этом формате:

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 

Рабочий код После после принятия на борту Мартейн Питерс исходного примера.

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] 
+0

Что вы пытаетесь проверить? Вы пытаетесь проверить, находится ли каждый ключ в словаре в списке интересов? или если каждый элемент в списке интересов находится в словаре? –

+0

Какой вывод вы ожидаете? – frmdstryr

ответ

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) будет цикл по списку, чтобы увидеть, если есть значение там, равный ему. Это не все, что эффективно, вы могли бы вместо того, чтобы использовать набор здесь 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 
+0

Спасибо за ответ. Это намного ближе к цели, чем я получал, но я хотел бы напечатать ключ и его значение как в if, так и в другом, но просто распечатать их по-разному. Как мне напечатать как ключ, так и значение? – iNoob

+1

@iNoob: просто переверните элементы; 'для имени хоста, ipaddress в new_dict.items():' и использовать 'if hostname в set_interest:'. Теперь у вас есть имя хоста и связанный с ним IP-адрес для печати. –

+0

Я обработал его после использования вашего первого примера без набора. Я обновлю рабочий код. Еще раз спасибо. – iNoob

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

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 

Это даст вам точный результат, который вы искали!

Смежные вопросы