Объясните, пожалуйста, как сделать так, чтобы повторяющиеся элементы не добавлялись в новый список
def enumeration(data, starter):
lister = []
for element in data:
if element in lister:
pass
else:
lister.append((element, starter))
starter += 1
return lister
list1 = [5, 4, 4, 3, 4, 2, 1]
list2 = enumeration(list1, 1)
print(list2)
Вот я хочу сделать так, чтобы, если элемент в старом списке повторяется, то в новый список он не заносится, и счетчик не инкрементируется. То есть я хотел, чтобы в исходном коде программа выдала: [(5, 1), (4, 2), (3, 3), (2, 4), (1, 5)]. Но он выдает: [(5, 1), (4, 2), (4, 3), (3, 4), (4, 5), (2, 6), (1, 7)], хотя в программе я вроде написал, что, если элемент повторяется, то добавлять его не надо и счетчик не инкрементировать. Я думаю, что ошибка скорее всего в том, что в новом списке нет именно одиночного элемента, а есть пара - (элемент, номер), и поскольку пара (элемент, номер) никогда не повторится, так как счетчик инкрементируется, то в новый список добавляется все. Но как тогда сделать, чтобы программа распознавала в этой паре именно элемент и не добавляла бы элемент с тем же значением?
P.S И объясните, пожалуйста, почему у нас список состоит именно из tuple, а не, например, список из списков. Заранее спасибо.
P.P.S Я знаю, что в питоне есть функция enumerate, просто хочется попробовать самому написать
Ответы (1 шт):
у вас список содержит кортежи
lister.append((element, starter))
а вы поиск делаете по элементу кортежа -
if element in lister
это так не работа
Вариантов решения задачи много, например можно использовать множество для индикатора того, что элемент уже использован:
def enumeration(data, starter):
unique = set()
lister = []
for element in data:
if element not in unique:
unique.add(element)
lister.append((element, starter))
starter += 1
return lister
list1 = [5, 4, 4, 3, 4, 2, 1]
list2 = enumeration(list1, 1)
print(list2)
Можно обойтись без set:
def enumeration(data, starter):
lister = []
for element in data:
if element not in lister:
lister.append(element)
lister = [(i[1], starter + i[0]) for i in enumerate(lister)]
return lister
А можно немного извратиться:
def enumeration(data, starter):
lister = []
for element in data:
if len(list(filter(lambda i: i[0] == element, lister))) == 0:
lister.append((element, starter + len(lister)))
return lister