#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)