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

Другим способом может быть использование for-loop для этого. Предположим, вы хотите, чтобы пользователь вводил 10 номеров в список с именем «memo»

memo=[] 
for i in range (10):
    x=int(input("enter no. \n")) 
    memo.insert(i,x)
    i+=1
print(memo) 
6
задан dsm 19 September 2008 в 06:29
поделиться

6 ответов

Наш район дружелюбный гуру Lisp указал на функцию удалять-дубликатов.

Он также обеспечил следующий отрывок:

(defun merge-lists (list-a list-b sort-fn test-fn)
    (sort (remove-duplicates (append list-a list-b) :test test-fn) sort-fn))
11
ответ дан 9 December 2019 в 22:42
поделиться

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

P.S.: Я сомневаюсь, что это может быть сделано намного быстрее, поскольку Вам в основном всегда нужны по крайней мере один вид и одно слияние. Возможно, можно объединить обоих в одной функции, но я не был бы удивлен, не имеет ли это (большое) значение.

1
ответ дан 9 December 2019 в 22:42
поделиться

Если списки отсортированы перед слиянием их они могут быть объединены, удалены с дубликатом и отсортированы одновременно. Если они отсортированы И без дубликатов, то функция merge/sort/duplicate-remove становится действительно тривиальной.

На самом деле могло бы быть лучше изменить Вашу функцию вставки так, чтобы это выполнило отсортированную вставку, которая проверяет на дубликаты. Затем Вы всегда сортировали списки, которые свободны от дубликатов, и слияние их является тривиальным вопросом.

С другой стороны Вы могли бы предпочесть иметь быструю функцию вставки за счет сортировки/удаления дубликатов позже.

1
ответ дан 9 December 2019 в 22:42
поделиться

Разве функция удалять-дубликатов не работала бы лучше, если бы вид был применен перед удалять-дубликатами?

0
ответ дан 9 December 2019 в 22:42
поделиться

Как Antti указал, Вы, вероятно, хотите усилить УДАЛЯТЬ-ДУБЛИКАТЫ и ВИД, хотя я, вероятно, использовал бы ключевое слово (или дополнительный аргумент) для тестовой функции: (defun списки слияния (перечисляют 1 список 2 вида-fn &key (тестируют #'eql))...), или (defun списки слияния (перечислите 1 список 2 вида-fn &optional (протестируйте #'eql)...),

Таким образом, Вы не должны будете указывать тестовую функцию (используемый УДАЛЯТЬ-ДУБЛИКАТАМИ для тестирования на, "эти продуманные дубликаты"), если EQL не достаточно хорош.

0
ответ дан 9 December 2019 в 22:42
поделиться

Кажется, что необходимо использовать Наборы.

-2
ответ дан 9 December 2019 в 22:42
поделиться
Другие вопросы по тегам:

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