2015-04-20 5 views
1

Я новичок в python и пытаюсь сделать функцию Uniqueify (L), которая будет дана либо списком чисел, либо списком строк (непустым), и вернет список уникальные элементы этого списка. До сих пор у меня есть:Уникальный возврат пустого списка

def Uniquefy(x): 
    a = [] 
    for i in range(len(x)): 
     if x[i] in a == False: 
      a.append(x[i]) 
    return a 

Похоже, что if str(x[i]) in a == False: не удается, и это вызывает функцию возвращать пустой список. Любая помощь, которую вы, ребята, можете предоставить?

ответ

2

Вы можете просто создать set на основе списка, который будет содержать только уникальные значения:

>>> s = ["a", "b", "a"] 
>>> print set(s) 
set(['a', 'b']) 
2

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

Если вам нужно создать его из списка и вам нужен список, попробуйте это. Однако, если нет конкретной причины, вам НЕОБХОДИМО список, а затем просто обходите набор (это будет путь утиной печати).

def uniquefy(x): 
    return list(set(x)) 
+2

Это изменит порядок элементов. – thefourtheye

1

Вы можете использовать встроенный в set типа, чтобы получить уникальные элементы из коллекции:

x = [1,2,3,3] 
unique_elements = set(x) 
4

реляционные операторы все имеют точно такой же приоритет, что и прикованы. Это означает, что эта строка:

if x[i] in a == False: 

вычисляется следующим образом:

if (x[i] in a) and (a == False): 

Это явно не то, что вы хотите.

Раствор для удаления второго оператора отношения:

if x[i] not in a: 
0

Если заказ вопросы:

def uniquefy(x): 
    s = set() 
    return [i for i in x if i not in s and s.add(i) is None] 

Else:

def uniquefy(x): 
    return list(set(x)) 
1

Вы должны использовать set() здесь. Это сокращает время работы in:

def Uniquefy(x): 
    a = set() 
    for item in x: 
     if item not in a: 
      a.add(item) 
    return list(a) 

Или что то же самое:

def Uniquefy(x): 
    return list(set(x)) 
+0

Я не думаю, что вам нужно использовать набор в первом примере, поскольку вы уже проверяете, что элемент не существует. ('if item not in a:') – vishen

+0

@vishen операция 'in', используемая в' list', намного медленнее по сравнению с ее использованием на 'set'. Вот почему я заменил 'list' на' set' в первом примере. –

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