Как мне написать программу, которая удалит все элементы, находящиеся между двумя дубликатами в списке, а также удалит второй дубликат.
Например, а = [(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)]. таким образом, вы можете игнорировать списки такого рода
Спасибо за разъяснение. Я изменил свой ответ, так что теперь он делает то, что вы хотите, я думаю.
Пожалуйста, не делайте больше работы для других людей, искажая свои посты. Размещая в сети Stack Exchange, вы предоставляете Stack Exchange безотзывное право в соответствии с лицензией CC BY-SA 4.0 распространять этот контент (т. е. независимо от вашего выбора в будущем). В соответствии с политикой Stack Exchange распространяется не подвергшаяся вандализму версия поста. Таким образом, любой вандализм будет отменен. Если вы хотите узнать больше об удалении поста, см.: Как работает удаление?
Вот один из способов сделать это с помощью 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 user20194358 Я обновил код, добавив несколько комментариев.
Вот один из способов.
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]
Что произойдет, если дубликаты перекрываются? Например, [(1, 0), (2, 0), (3, 0), (1, 0), (2, 0)].