Удаление одинаковых элементов списка в цикле
Например есть список S = [1, 5, 5, 1, 1, 7]. Во время цикла программа вычисляет повторяющиеся элементы, выводит их на экран, и затем должна удалить их из списка. Я пробовал так:
S = [1, 5, 5, 1, 1, 7]
S.sort()
i = 0
for i in S:
a = S.count(i)
if a > 1:
print(i,end=' ')
S.remove(i)
i += 1
Однако, программа удаляет только один элемент первого вхождения. Подскажите, пожалуйста, как за один раз удалить все одинаковые элементы в списке.
Ответы (3 шт):
Проблема в том, что у вас перебор списка и удаление из него идут в одном месте.
А так, можно через множество прогнать список. В множестве не может быть дубликатов:
items = [1, 5, 5, 1, 1, 7]
items = list(set(items))
print(items)
# [1, 5, 7]
Либо удаляйте, но в обратном порядке:
items = [1, 5, 5, 1, 1, 7]
for i in reversed(items):
if items.count(i) > 1:
items.remove(i)
print(items)
# [5, 1, 7]
Кст, вместо reversed можно использовать list, тогда будет создана копия списка и это тоже будет работать, т.к. удаление будет из исходного списка, а перебор у копии списка:
for i in list(items)
# или
for i in items[::-1]
например можно сделать так, правда это немного извращённо:
вариант 1:
S = [1, 5, 5, 1, 1, 7]
data = sorted(S)
S_new = [data[0]]
S_dublicated = set()
for i in range(1, len(data)):
if data[i] == data[i-1]:
S_dublicated.add(data[i])
else:
S_new.append(data[i])
print(*S_dublicated)
print(*S_new)
вариант 2:
S = [1, 5, 5, 1, 1, 7]
S_new = set()
S_dublicated = set()
for obj in S:
if obj in S_new:
S_dublicated.add(obj)
S_new.add(obj)
# for obj in S:
# S_dublicated.add(obj) if obj in S_new else S_new.add(obj)
print(*S_dublicated)
print(*S_new)
# Date: October 26th, 2020.
'''
Задача: один раз вывести дублирующиеся элементы.
'''
array=[1, 5, 5, 1, 1, 7]
_temp=set(array)
print(f"array: {array}.")
print(f"_tmp: {_temp}.")
# _temp - набор уникальных значений array.
for item in _temp:
count=array.count(item)
if count > 1:
print(f"Значение {item} дублировалось {count} раз(а).")
array=list(_temp)
del _temp
print("Новый список:", '\n', array)