Python: последний индекс не повторяется - PullRequest
1 голос
/ 19 июня 2020

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

Вот мое решение:

new_list = [1,1,1,1,2,2,3,3,3,3,4,5]
updated_lst = []
for i in range(0,len(new_list)-1):
    if new_list[i] != new_list[i+1]:
        updated_lst.append(new_list[i])
print(updated_lst)

Вывод: [1, 2, 3, 4], но отсутствует 5 в new_list.

Кроме того, я новичок в python и знаю, что знаю, что могу сделать что-то вроде

updated_list = []
for i in new_list:
   if i not in updated_list[]:
       updated_list.append(i)

Но мне было интересно, как я могу заставить мое первоначальное решение работать.

Большое спасибо

Ответы [ 4 ]

2 голосов
/ 19 июня 2020

Ваша проблема в том, что встроенная функция range(N, M) будет выполнять итерацию от N до M - 1, поэтому вам не следует устанавливать второй аргумент в len(new_list)-1, а в len(new_list).

См. Ссылку здесь .

Это не заставит ваше первое решение работать, но объяснит, почему вы не получите свой последний элемент.

Заявлено, что это решение не оптимально, способ для достижения этого путем просмотра индексов вручную будет:

new_list = [1,1,1,1,2,2,3,3,3,3,4,5]
updated_lst = []

for i in range(0,len(new_list)):
    found = False

    for j in range(0, len(updated_lst)):
        if new_list[i] == updated_lst[j]:
            found = True
            break

    if not found:
        updated_lst.append(new_list[i])

print(updated_lst)

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

Спасибо @ncasale за помощь в улучшении ответа.

Кстати, ваш первый алгоритм не удалит дубликаты, а только повторы. Другой способ добиться желаемого - это list(set(new_list)).

0 голосов
/ 20 июня 2020

Set - это неупорядоченный тип данных коллекции, который не имеет повторяющихся элементов . Для желаемого результата мы можем преобразовать данный список в набор, который удалит все повторяющиеся элементы. Затем мы снова можем преобразовать его в список. Как показано ниже:

new_list = [1,1,1,1,2,2,3,3,3,3,4,5]
x=set(new_list)
print(list(x))

Результат будет напечатан как:

[1, 2, 3, 4, 5]

Таким образом мы получим список без каких-либо повторяющихся элементов. Надеюсь, это поможет!

0 голосов
/ 19 июня 2020

Я не уверен, требует ли ваша проблема перебора списка, но вы можете легко найти все уникальные элементы в списке, преобразовав его как set. Затем вы можете получить list обратно, преобразовав это set обратно в list.

new_list = [1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5]
unique = set(new_list)
print(list(unique))

Возврат:

[1, 2, 3, 4, 5]

0 голосов
/ 19 июня 2020

Я предлагаю W3schools : для этой проблемы, но в вашем конкретном случае c я бы сделал это следующим образом:

new_list = [1,1,1,1,2,2,3,3,3,3,4,5]
new_list = list(dict.fromkeys(new_list))
print(new_list)

ouput: "[1, 2, 3, 4, 5] "

надеюсь, что это помогло

...