Python: проверка наличия существующих записей во встроенном интерфейсе

#python #list #tuples #iteration

#питон #Список #кортежи #итерация #python

Вопрос:

У меня есть кортеж из кортежей. Я хочу выполнить итерацию по каждому вложенному кортежу, но я хочу проверить, был ли он уже добавлен в другой список (проверка на наличие дубликатов на основе IP). Если он еще не был добавлен, я хочу добавить содержимое всего вложенного кортежа в новый список.

Я думаю, я знаю, что это не делает того, что я намереваюсь, потому что мне нужно проверить внутри каждого вложенного кортежа в новом списке IP, чтобы увидеть, дублируется ли он, но я не могу понять, как проверить внутри вложенных элементов нового списка.

 example = (('ROUTER1', '17.2.155.224', 'WS-C3850-48T-E'),('ROUTER2', '27.24.251.212', 'WS-C3850-48T-E'),('ROUTER3', '27.24.251.212', 'WS-C3850-48T-E'))

new_list = []

for item in example:
    if item[1] in new_list:
       pass
    else:
       new_list.append(item)
        
print(new_list)
  

Комментарии:

1. Вы могли бы использовать другой список с именем dups , в котором вы будете хранить все повторенные IP-адреса.

Ответ №1:

Используйте словарь вместо списка, так будет проще и эффективнее проверять дублирующиеся IP-адреса.

Ключами словаря являются IP-адреса, а значениями — кортежи.

 example = (('ROUTER1', '17.2.155.224', 'WS-C3850-48T-E'), ('ROUTER2', '27.24.251.212', 'WS-C3850-48T-E'),
           ('ROUTER3', '27.24.251.212', 'WS-C3850-48T-E'))

new_dict = dict()

for item in example:
    # Checking if an IP already been added
    if item[1] in new_dict.keys():
        pass
    else:
        # Adding a new entry to the dictionary => < IP : tuple >
        new_dict[item[1]] = item

print(new_dict.values())
  

Комментарии:

1. Это сработало, Авив, спасибо. Я выбрал приведенный ниже ответ в качестве решения, потому что это не потребовало от меня повторной работы следующей функции, которую я должен использовать словарь вместо списка (который на самом деле представляет собой 3 списка).

Ответ №2:

Это можно сделать двумя способами.

Вариант 1:

Вы можете использовать понимание списка в цикле самостоятельно. Это сохраняет структуру, которая у вас есть в данный момент, и не добавляет новую переменную, но увеличивает сложность по времени.

 example = (('ROUTER1', '17.2.155.224', 'WS-C3850-48T-E'), ('ROUTER2', '27.24.251.212', 'WS-C3850-48T-E'),
           ('ROUTER3', '27.24.251.212', 'WS-C3850-48T-E'))

new_list = []

for item in example:
    if item[1] in [elm[1] for elm in new_list]:
        pass
    else:
        new_list.append(item)

print(new_list)
  

Вариант 2

Этот способ вводит новую переменную, но намного быстрее, потому что вы не зацикливаете дополнительный набор через переменную на каждой итерации.

 example = (('ROUTER1', '17.2.155.224', 'WS-C3850-48T-E'), ('ROUTER2', '27.24.251.212', 'WS-C3850-48T-E'),
           ('ROUTER3', '27.24.251.212', 'WS-C3850-48T-E'))

new_list = []
found = []

for item in example:
    if item[1] in found:
        pass
    else:
        new_list.append(item)
        found.append(item[1])

print(new_list)