Как удалить все элементы, которые находятся между двумя дубликатами в списке

Как мне написать программу, которая удалит все элементы, находящиеся между двумя дубликатами в списке, а также удалит второй дубликат.

Например, а = [(0,0) , (1,0) , (2,0) , (3,0) , (1,0) ] В списке a мы видим, что (1,0) встречается в списке более одного раза. Таким образом, я хочу удалить все элементы между двумя дубликатами и хочу удалить второе вхождение (1,0). Таким образом, в этом примере я хочу удалить (2,0),(3,0) и второе вхождение (1,0). теперь мой список будет выглядеть так: a = [(0,0),(1,0)] Мне удалось это сделать, однако проблема возникает, когда в моем списке более 1 дубликата. Например, b = [(0,0) , (1,0) , (2,0) , (3,0) , (1,0) , (5,0) , (6,0) , (7,0) , (8,0) , (5,0), (9,0) , (10,0) ] В этом примере мы видим, что у меня есть 2 повторяющихся элемента. У меня (1,0) и у меня (5,0). Таким образом, я хочу удалить все элементы между (1,0) и вторым вхождением (1,0), включая его второе вхождение, и я хочу удалить все элементы между (5,0) и вторым вхождением (5 ,0). В итоге мой список должен выглядеть так : б = [(0,0) , (1,0) ,(5,0) , (9,0) ]

Это то, что у меня есть до сих пор:

    a = [ (0,0) , (1,0) , (2,0) , (3,0) , (1,0) ]
indexes_of_duplicates = []
for i,j in enumerate(a):
    if a.count(j) > 1 :
        indexes_of_duplicates.append(i)
for k in range(indexes_of_duplicates[0]+1,indexes_of_duplicates[1]+1):
    a.pop(indexes_of_duplicates[0]+1)
print(a)  

Выход: [(0, 0), (1, 0)] как видите, этот код будет работать только в том случае, если у меня есть только 1 дубликат в моем списке, но я понятия не имею, как это сделать, если у меня есть более одного дубликата. PS: я не могу получить список с такими перекрытиями [(1, 0), (2, 0), (3, 0), (1, 0), (2, 0)]. таким образом, вы можете игнорировать списки такого рода

Что произойдет, если дубликаты перекрываются? Например, [(1, 0), (2, 0), (3, 0), (1, 0), (2, 0)].

ddejohn 20.11.2022 05:26

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

Bill 20.11.2022 06:58

Пожалуйста, не делайте больше работы для других людей, искажая свои посты. Размещая в сети Stack Exchange, вы предоставляете Stack Exchange безотзывное право в соответствии с лицензией CC BY-SA 4.0 распространять этот контент (т. е. независимо от вашего выбора в будущем). В соответствии с политикой Stack Exchange распространяется не подвергшаяся вандализму версия поста. Таким образом, любой вандализм будет отменен. Если вы хотите узнать больше об удалении поста, см.: Как работает удаление?

Suraj Rao 20.11.2022 08:29
Мутабельность и переработка объектов в Python
Мутабельность и переработка объектов в Python
Объекты являются основной конструкцией любого языка ООП, и каждый язык определяет свой собственный синтаксис для их создания, обновления и...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
Проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
0
3
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот один из способов сделать это с помощью index:

lst = [(0,0), (1,0), (2,0), (3,0), (1,0), (5,0), (6,0), (7,0), (8,0), (5,0), (9,0), (10,0)]

output = []

while lst: # while `lst` is non-empty
    x, *lst = lst # if lst = [1,2,3], for example, now x = 1 and lst = [2,3]
    output.append(x)
    try: # try finding the x in lst
        lst = lst[lst.index(x)+1:] # if found, reduce the lst (i.e., skip the first lst.index(x)+1 elememts
    except ValueError: # if not found
        pass # do nothing

print(output) # [(0, 0), (1, 0), (5, 0), (9, 0), (10, 0)]

Обратите внимание, что lst будет исчерпан. Если вы хотите сохранить его, вы можете скопировать его заранее.

Я не понимаю, почему это работает или как это работает, но большое спасибо. Кроме того, как вы думаете, нормально ли, что новичок не может решить такую ​​​​проблему, или я должен быть в состоянии?

user20194358 20.11.2022 05:59

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

user20194358 21.11.2022 15:41

@user20194358 user20194358 Я обновил код, добавив несколько комментариев.

j1-lee 21.11.2022 17:54

Вот один из способов.

from collections import Counter

a = [0, 'x', 2, 3, 'x', 4, 'y', 'y', 6]

# Count the number of occurrence of each unique value
counts = Counter(a)

removing = None
new_list = []
for item in a:
    if removing: 
        if item == removing:
            removing = None
        continue
    if counts[item] > 1:
        removing = item
    new_list.append(item)

print(new_list)

Вывод:

[0, 'x', 4, 'y', 6]

Другие вопросы по теме