2012-02-21 2 views
0

Что у меня есть только для удаления дублированных элементов и их сортировки. Мне нужно удалить один экземпляр каждого элемента и вернуть новый список с элементами в нем. Это то, что я есть:Возврат копии списка, в котором удаляется один экземпляр каждого значения.

def rem(nlst): 
    n = [] 
    for x in nlst: 
     if x not in n: 
      n.append(x) 
      n.sort() 
    return n 

Это то, что он должен делать:

>>> rem([4]) 
[] 
>>> rem([4,4]) 
[4] 
>>> rem([4, 1, 3, 2]) 
[] 
>>> rem([2, 4, 2, 4, 4]) 
[2, 4, 4] 
+0

поблагодарить вас Свен, ваш ответ предоставляется только то, что мне нужно, и вы ответили довольно быстро слишком! – AngelE

ответ

3

Простая реализация является использование collections.Counter:

def rem(iterable): 
    c = collections.Counter(iterable) 
    for k in c: 
     c[k] -= 1 
    return sorted(c.elements()) 

В Python версии, прежде чем 2.7, collections.Counter является недоступен. Вы можете использовать набор для записи элементы, которые вы уже видели, вместо:

def rem(iterable): 
    result = [] 
    seen = set() 
    for x in iterable: 
     if x in seen: 
      result.append(x) 
     else: 
      seen.add(x) 
    result.sort() 
    return result 
+0

А ... Счетчик! Отличное использование. – sberry

0
y = x[:] 
for r in set(x): 
    y.remove(r) 
+0

Хотя это довольно красно, я избегал этой реализации, потому что это O (n^2). –

+0

Я обычно использую простые, pythonic-решения, если только высокая производительность явно не указана как требование. – wim

0

Незначительный твик вашего кода, кажется, работает нормально. Просто добавили переменную для отслеживания текущего значения и только добавить новый, если вы уже видели, что значение:

def rem(nlist): 
    n = [] 
    nlist.sort() 
    cur = None 
    for x in nlist: 
     if x == cur: 
      n.append(x) 

     cur = x 

    return n 

~