Как убрать одинаковые элементы массива python
Удаляем одинаковые элементы из через создание множества. Множество отличается от списка тем, что любой элемент может быть представлен в нём только один раз:
nums = [1, 2, 3, 8, 9, 1, 8, 8, 9] list(set(nums)) # [1, 2, 3, 8, 9]
Убрать одинаковые элементы из массива можно также перебирая все элементы в цикле:
nums = [1, 2, 3, 8, 9, 1, 8, 8, 9] result = [] for num in nums: if num not in result: result.append(num) print(result) # => [1, 2, 3, 8, 9]
Как удалить в списке значения, которые повторяются?
У меня есть код, он парсит данные и получает всегда список с значениями в которых повторяются начальные элементы, а потом идёт никнейм пользователя, хочу удалить повторяющиеся элементы, а оставить имя пользователя, в данном случае повторяющийся элемент это »https://www.instagram.com/’:
all_urls=follow_url.find_elements_by_tag_name('li') i=[i.find_element_by_tag_name('a').get_attribute('href') for i in all_urls] print(i)
в итоге я получаю простой список: [‘https://www.instagram.com/green_delux/’, ‘https://www.instagram.com/sweet_apple_krd/’] и мне нужно убрать всё лишнее и оставить такой исход: [‘green_delux’, ‘sweet_apple_krd’]
- Вопрос задан более года назад
- 174 просмотра
Комментировать
Решения вопроса 1
преобразовать list в set , в сете останутся только уникальные элементы (тк не все функции могут принимать set вместо list, можно на всякий случай преобразовать снова в тип «список»)
но тут не набор уникальных элементов нужен, а обрезать всё, что после инстаграмма. Если именно так, то, зная, где резать, можно в каждом элементе в генераторе списка отбрасывать первые 26 символов и последний
i=[i.find_element_by_tag_name('a').get_attribute('href')[26:-1] for i in all_urls]
Удаление одинаковых элементов в отсортированном листе (списке)
Например, у меня есть лист x = [a, a, a, f, h, k, k] . Мне надо сделать, что бы в этом листе было только одно a и одно k , т.е. удалить лишние похожие элементы, остальные не трогать. Похожие элементы всегда рядом, т.к. лист просортирован. Как реализовать удаление этих лишних элементов?
Отслеживать
52.2k 11 11 золотых знаков 108 108 серебряных знаков 312 312 бронзовых знаков
задан 9 окт 2016 в 13:32
722 1 1 золотой знак 6 6 серебряных знаков 20 20 бронзовых знаков
11 окт 2016 в 20:50
ассоциация: stackoverflow.com/questions/89178/…
2 мар 2017 в 13:41
7 ответов 7
Сортировка: Сброс на вариант по умолчанию
Можно использовать модуль itertools:
from itertools import groupby x = ['a', 'a', 'a', 'f', 'h', 'k', 'k'] new_x = [el for el, _ in groupby(x)] print(new_x) # ['a', 'f', 'h', 'k']
Способ лучше варианта с set тем, что itertools.groupby сохраняет тот порядок, в котором элементы шли в изначальной последовательности. В то время, как set не гарантирует сохранения порядка.
Отслеживать
ответ дан 9 окт 2016 в 15:03
20.4k 4 4 золотых знака 25 25 серебряных знаков 52 52 бронзовых знака
Оптимальный вариант
9 окт 2016 в 15:17
только я ю делал это через itertools.Counter
9 окт 2016 в 19:53
способ сработает только для предварительного отсортированного списка
10 окт 2016 в 10:54
@vadimvaduxa В вопросе указано, что список отсортирован
10 окт 2016 в 12:20
даже рецепт есть готовый: unique_justseen() : map(itemgetter(0), groupby(‘aaafhkk’)) см. more_itertools пакет
11 окт 2016 в 20:46
Проще всего так:
>>> l = [1, 1, 2, 3, 3, 5] >>> print list(set(l)) [1, 2, 3, 5] >>>
Отсортирован ли изначальный список, значения не имеет. Однако, способ не универсален, например:
>>> l = [1, 1, 2, 3, 3, [4, 5, 6]] >>> print list(set(l)) Traceback (most recent call last): File "", line 1, in TypeError: unhashable type: 'list'
def f(l): n = [] for i in l: if i not in n: n.append(i) return n print f([1, 1, 2, 3, 3, [4, 5, 6]]) # [1, 2, 3, [4, 5, 6]] print f([[1, 2], [1, 2], 3, 4, 4, 'oops', 'oops']) # [[1, 2], 3, 4, 'oops']
Если (как в условии) входящий список так или иначе отсортирован, в последнем алгоритме (функция f) вместо
if i not in n: n.append(i)
if not n or i != n[-1]: n.append(i)
что существенно улучшит эффективность.
Отслеживать
ответ дан 9 окт 2016 в 13:35
7,461 13 13 серебряных знаков 31 31 бронзовый знак
способ совсем не универсален, тк работает только для вложенности первого порядка
10 окт 2016 в 10:55
@vadimvaduxa . print f([[1, [2]], [1, [2]], 3, 4, 4, ‘oops’, ‘oops’]) —> [[1, [2]], 3, 4, ‘oops’]
10 окт 2016 в 18:31
set(L) не гарантирует сохранения порядка, если хочется его сохранить, то можно OrderedDict.fromkeys(L) использовать. Функция f() квадратична ( O(n**2) ), можно groupby(sorted(L)) использовать ( O(n log n) ), если элементы нехэшируемые. Иллюстрация: если n миллион, то квадратичный алгоритм требует порядка 1000_000_000_000 операций, а O(n log n) только порядка 10_000_000 (если ввод задачи не ограничен условиями, то полезно следить за трудоёмкостью алгоритма (по порядку величины)).
11 окт 2016 в 21:39
import itertools x = 2, 2, 4, 3, 3, 1, 1, 2, 5, 4, 2, 1 print('data1:', x) # простой спрособ - set, но теряется сортировка исходного списка r = set(x) print('set:', r) # способ groupby подходит не совсем, тк уникальны только элементы идущие подряд r = [a[0] for a in itertools.groupby(x)] print('неверно groupby no sort:', r) r = set(a[0] for a in itertools.groupby(x)) print('верно groupby no sort:', r) # если список сначала отсортировать r = [a[0] for a in itertools.groupby(sorted(x))] print('groupby sort:', r) # способ при котором не теряется сортировка исходного списка def unique(obj: iter): args = [] for a in obj: if a not in args: args.append(a) yield a r = unique(x) print('original sort unique:', *r) # если список вложенный и заранее неизвесна степень вложенности x = 2, (2, 4), [3], [3, [1, [1, 2, ([5],)], [4]], 2, 1] print('\ndata2:', x) def unpack(obj: iter): for o in obj: if isinstance(o, (list, tuple)): yield from unpack(o) else: yield o r = unique(unpack(x)) print('unpack', *r)
data1: (2, 2, 4, 3, 3, 1, 1, 2, 5, 4, 2, 1) set: неверно groupby no sort: [2, 4, 3, 1, 2, 5, 4, 2, 1] верно groupby no sort: groupby sort: [1, 2, 3, 4, 5] original sort unique: 2 4 3 1 5 data2: (2, (2, 4), [3], [3, [1, [1, 2, ([5],)], [4]], 2, 1]) unpack 2 4 3 1 5
Удаление дубликатов из списка Python с сохранением очередности
Чтобы избавиться от дублирующих значений в списке Python, первое, что приходит в голову, это воспользоваться свойством множества set хранить только уникальные значения.
>>> lst = [9, 5, 3, 1, 7, 6, 5, 3, 1, 4, 3, 2, 1] >>> list(set(lst)) # [1, 2, 3, 4, 5, 6, 7, 9]
Из примера видно, что получены только уникальные значения исходного списка lst . Большой недостаток такого способа удаления дубликатов заключается в том, что итоговый список теряет порядок очередности значений, что следует из определения множества (множество — это неупорядоченная последовательность различных хешированных объектов).
Так как же удалить дубликаты в списке и при этом сохранить порядок элементов списка? В этом могут помочь следующие два свойства словаря Python dict :
- Ключи словаря не могут иметь дублирующие значения.
- Словари в Python сохраняют очерёдность (помнят порядок) вставки ключей.
Для создания словаря Python из последовательности (списка list ) воспользуемся генератором словаря:
>>> lst = [9, 5, 3, 1, 7, 6, 5, 3, 1, 4, 3, 2, 1] >>> d = key:0 for key in lst> >>> d # # теперь просто получим ключи словаря >>> list(d) # [9, 5, 3, 1, 7, 6, 4, 2]
Из примера видно что полученный список (без дубликатов) сохранил очерёдность значений, как и ожидалось.
Еще проще использовать метод dict.fromkeys() , который создаёт словарь из последовательности ключей.
>>> lst = [9, 5, 3, 1, 7, 6, 5, 3, 1, 4, 3, 2, 1] >>> d = dict.fromkeys(lst) >>> d # # теперь просто получим ключи словаря >>> list(d) # [9, 5, 3, 1, 7, 6, 4, 2]
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Изменение/замена элемента списка по индексу
- Изменение части списка операцией среза
- Изменение списка срезом c заданным шагом
- Удаление части списка операцией среза
- Удаление части списка по срезу с заданным шагом
- Метод list.append(), добавляет значение в конец списка
- Метод list.clear(), очищает список
- Метод list.copy(), копия списка
- Метод list.extend(), расширяет список другой последовательностью
- Расширение списка его содержимым
- Метод list.insert(), вставить элемент по индексу
- Метод list.pop(), получение с удалением элемент списка
- Метод list.remove(), удаление элемента списка по значению
- Метод list.reverse(), разворачивает элементы списка
- Удаление элемента списка по индексу
- Удаление дубликатов из списка Python с сохранением очередности