2016-01-09 5 views
-3

Я думал, если можно создать список уникальных элементов из двух списков короче, но без использования set?уникальные элементы в двух списках

l1 = [1,1,2,2,3] 
l2 = [2,1,3,3,4] 
unique = [] 
for elem in l1+l2: 
    if elem not in unique: 
     unique.append(elem) 
print unique 

[1,2,3,4] 

Спасибо за ваши идеи

+1

Uhhh просто использовать 'set'. Я думаю, 'dict.fromkeys (l1 + l2) .keys()', но это в значительной степени обман. –

+0

@AdamSmith это очень интересное решение – tinySandy

+1

@pianista: Не было downvote, но я думаю, что причина такова: * Почему бы не использовать 'set'? Вот почему у Python есть 'set', вот что он делает. * –

ответ

2

Во-первых, вы должны использовать set в Python, чтобы найти уникальные значения, потому что это эффективно дает уникальные элементы.

Если вы хотите использовать list, то код, который вы предоставили, является правильным! Если вы используете numpy в коде (который может быть хорошим выбором для больших объемов данных), проверить numpy.unique

>>> import numpy as np 
>>> wordsList = [u'nowplaying', u'PBS', u'PBS', u'nowplaying', u'job', u'debate', u'thenandnow'] 
>>> np.unique(wordsList) 
array([u'PBS', u'debate', u'job', u'nowplaying', u'thenandnow'], 
     dtype='<U10') 

Также обратите внимание на следующие результаты тестов для поиска unique valuesLink

кода предоставляются на связь, но при добавлении здесь для справки:

def f1(seq): 
    # not order preserving 
    set = {} 
    map(set.__setitem__, seq, []) 
    return set.keys() 

def f2(seq): 
    # order preserving 
    checked = [] 
    for e in seq: 
     if e not in checked: 
      checked.append(e) 
    return checked 

def f3(seq): 
    # Not order preserving 
    keys = {} 
    for e in seq: 
     keys[e] = 1 
    return keys.keys() 

def f4(seq): 
    # order preserving 
    noDupes = [] 
    [noDupes.append(i) for i in seq if not noDupes.count(i)] 
    return noDupes 

def f5(seq, idfun=None): 
    # order preserving 
    if idfun is None: 
     def idfun(x): return x 
    seen = {} 
    result = [] 
    for item in seq: 
     marker = idfun(item) 
     # in old Python versions: 
     # if seen.has_key(marker) 
     # but in new ones: 
     if marker in seen: continue 
     seen[marker] = 1 
     result.append(item) 
    return result 

def f6(seq): 
    # Not order preserving  
    set = Set(seq) 
    return list(set) 

Benchmark Результаты

* f2 13.24 
* f4 11.73 
* f5 0.37 
f1 0.18 
f3 0.17 
f6 0.19 
+0

f2, по сути, такое же, как и решение op, равно O (n^2) с точки зрения временной сложности. Как результат показывает, что это один из самых медленных алгоритмов. –

-3

В частности, используя код

l1 = [1,1,2,2,3] 
l2 = [2,1,3,3,4] 
unique=set(l1+l2) 

Если вы хотите, как список не как набор

unique=list(set(l1+l2)) 
+0

это не ответ, так как я специально попросил не использовать set – tinySandy

Смежные вопросы