Если вам нужно сохранить порядок первого вхождения каждой пары, вы можете использовать набор с операцией XOR для значений, чтобы чередовать первое и второе вхождения.
List = [10, 10, 11, 20, 15, 20, 15, 11, 10, 10]
paired = [ i for pairs in [set()] for i in List if pairs.symmetric_difference_update({i}) or i in pairs]
print(p)
# [10, 11, 20, 15, 10]
Вы также можете сделать это с помощью функции накопления из itertools:
from itertools import accumulate
paired = [a for a,b in zip(List,accumulate(({n} for n in List),set.__xor__)) if a in b]
print(paired)
# [10, 11, 20, 15, 10]
Или используйте растровое изображение вместо набора (если ваши значения являются относительно небольшими положительными целыми числами (например, между 0 и 64):
paired = [ n for n,m in zip(List,accumulate((1<<n for n in List),int.__xor__)) if (1<<n)&m ]
print(paired)
# [10, 11, 20, 15, 10]
Или вы можете использовать Счетчик из коллекций
from collections import Counter
paired = [ i for c in [Counter(List)] for i in List if c.update({i:-1}) or c[i]&1 ]
print(paired)
# [10, 11, 20, 15, 10]
И, если вы не слишком беспокоитесь об эффективности, это может сделать двойная сортировка с двухступенчатым шагом:
paired = [List[i] for i,_ in sorted(sorted(enumerate(List),key=lambda n:n[1])[::2])]
print(paired)
# [10, 11, 20, 15, 10]