Удаление дубликатов в списках

В моем случае проблема заключалась в том, что мне нужно было добавить переменные среды для http_proxy и https_proxy.

Например,

http_proxy=http://your_proxy:your_port
https_proxy=https://your_proxy:your_port

Чтобы установить эти переменные среды в Windows, см. ответы на на этот вопрос .

817
задан Georgy 14 June 2019 в 16:08
поделиться

2 ответа

В этом ответе, будут два раздела: Два уникальных решения и график скорости для определенных решений.

Объекты Дубликата Удаления

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

наборы. Счетчик является мощным инструментом в стандартной библиотеке, которая могла идеально подойти для этого. Существует только еще одно решение, которое даже имеет Счетчик в нем. Однако то решение также ограничено [1 115] hashable ключи.

Для разрешения unhashable ключей в Счетчике я сделал Контейнерный класс, который попытается получить хеш-функцию объекта по умолчанию, но если это перестанет работать, то это попробует свое тождественное отображение. Это также определяет eq и хеш метод. Этого должно быть достаточно для разрешения unhashable объекты в нашем решении. Объекты Unhashable будут рассматривать, как будто они hashable. Однако эта хеш-функция использует идентификационные данные для unhashable объектов, означая два равных объекта, которые оба unhashable, не будет работать. Я предлагаю, чтобы Вы переопределяющий это и изменяющий его использовали хеш equalivent изменяемого типа (как использование hash(tuple(my_list)), если my_list список).

я также сделал два решения. Другое решение, которое сохраняет порядок пунктов, с помощью подкласса и OrderedDict и Счетчика, который называют 'OrderedCounter'. Теперь, вот функции:

from collections import OrderedDict, Counter

class Container:
    def __init__(self, obj):
        self.obj = obj
    def __eq__(self, obj):
        return self.obj == obj
    def __hash__(self):
        try:
            return hash(self.obj)
        except:
            return id(self.obj)

class OrderedCounter(Counter, OrderedDict):
     'Counter that remembers the order elements are first encountered'

     def __repr__(self):
         return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))

     def __reduce__(self):
         return self.__class__, (OrderedDict(self),)

def remd(sequence):
    cnt = Counter()
    for x in sequence:
        cnt[Container(x)] += 1
    return [item.obj for item in cnt]

def oremd(sequence):
    cnt = OrderedCounter()
    for x in sequence:
        cnt[Container(x)] += 1
    return [item.obj for item in cnt]

remd не заказан, сортируя, oremd заказан, сортируя. Можно ясно сказать, какой быстрее, но я объясню так или иначе. Незаказанная сортировка немного быстрее. Это сохраняет меньше данных, так как это не должно заказывать.

Теперь, я также хотел показать сравнения скорости каждого ответа. Так, я сделаю это теперь.

, Какая Функция является Самой Быстрой?

Для удаления дубликатов, я собрал 10 функций из нескольких ответов. Я вычислил скорость каждой функции и поместил ее в график с помощью [1 117] matplotlib.pyplot.

я разделил это на три раунда построения графика. hashable является любой объект, который может быть хеширован, unhashable является любой объект, который не может быть хеширован. Заказанная последовательность является последовательностью, которая сохраняет порядок, незаказанная последовательность не сохраняет порядок. Теперь, вот еще несколько условий:

Незаказанный Hashable был для любого метода, который удалил дубликаты, которые должны были не обязательно сохранить порядок. Это не должно было работать на unhashables, но это могло.

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

Заказанный Unhashable был любым методом, который сохранил порядок пунктов в списке и работал на unhashables.

На оси y сумма секунд, которые потребовалось.

На оси X число, к функции относились.

Мы генерировали последовательности для незаказанного hashables и заказали hashables со следующим пониманием: [list(range(x)) + list(range(x)) for x in range(0, 1000, 10)]

Для заказанного unhashables: [[list(range(y)) + list(range(y)) for y in range(x)] for x in range(0, 1000, 10)]

Примечание там является 'шагом' в диапазоне, потому что без него, это брало бы 10x как долго. Также, потому что по моему личному мнению, я думал, что, возможно, выглядело немного легче читать.

Также отмечают, что ключи на легенде - то, что я пытался предположить как наиболее жизненно важные части функции. Что касается какого функция делает худшее или лучшее? График выступает за себя.

С улаженным, вот графики.

Незаказанный Hashables

enter image description here (Увеличенный) enter image description here

Заказанный Hashables

enter image description here (Увеличенный) enter image description here

Заказанный Unhashables

enter image description here (Увеличенный) enter image description here

4
ответ дан 22 November 2019 в 21:06
поделиться

Волшебство Python Встроенный тип

В Python, очень легко обработать сложные случаи как это и только встроенным типом Python.

Позволяют мне показать Вам, как сделать!

Метод 1: Общий случай

путь ( 1 линейный код ), чтобы удалить дублированный элемент в списке и все еще сохранить порядок сортировки

line = [1, 2, 3, 1, 2, 5, 6, 7, 8]
new_line = sorted(set(line), key=line.index) # remove duplicated element
print(new_line)

Вы получите результат

[1, 2, 3, 5, 6, 7, 8]

Метод 2: Особый случай

TypeError: unhashable type: 'list'

особый случай для обработки unhashable ( 3 линейных кода )

line=[['16.4966155686595', '-27.59776154691', '52.3786295521147']
,['16.4966155686595', '-27.59776154691', '52.3786295521147']
,['17.6508629295574', '-27.143305738671', '47.534955022564']
,['17.6508629295574', '-27.143305738671', '47.534955022564']
,['18.8051102904552', '-26.688849930432', '42.6912804930134']
,['18.8051102904552', '-26.688849930432', '42.6912804930134']
,['19.5504702331098', '-26.205884452727', '37.7709192714727']
,['19.5504702331098', '-26.205884452727', '37.7709192714727']
,['20.2929416861422', '-25.722717575124', '32.8500163147157']
,['20.2929416861422', '-25.722717575124', '32.8500163147157']]

tuple_line = [tuple(pt) for pt in line] # convert list of list into list of tuple
tuple_new_line = sorted(set(tuple_line),key=tuple_line.index) # remove duplicated element
new_line = [list(t) for t in tuple_new_line] # convert list of tuple into list of list

print (new_line)

Вы получите результат:

[
  ['16.4966155686595', '-27.59776154691', '52.3786295521147'], 
  ['17.6508629295574', '-27.143305738671', '47.534955022564'], 
  ['18.8051102904552', '-26.688849930432', '42.6912804930134'], 
  ['19.5504702331098', '-26.205884452727', '37.7709192714727'], 
  ['20.2929416861422', '-25.722717575124', '32.8500163147157']
]

, поскольку кортеж hashable и можно преобразовать данные между списком и кортежем легко

2
ответ дан 22 November 2019 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: