2016-02-21 3 views
1

Write a function that accepts an input list and returns a new list which contains only the unique elements (Elements should only appear one time in the list and the order of the elements must be preserved as the original list.).Как найти уникальные элементы в списке в python? (Без использования набора)

def unique_elements (list): 
    new_list = [] 
    length = len(list) 
    i = 0 
    while (length != 0): 
     if (list[i] != list [i + 1]): 
      new_list.append(list[i]) 
     i = i + 1 
     length = length - 1 
    '''new_list = set(list)''' 
    return (new_list) 

#Main program 
n = int(input("Enter length of the list: ")) 
list = [] 
for i in range (0, n): 
    item = int(input("Enter only integer values: ")) 
    list.append(item) 
print ("This is your list: ", list) 
result = unique_elements (list) 
print (result) 

Я застрял с этой ошибкой:

IndexError: list index out of range

+3

Только быстрое примечание, 'list' это ключевое слово – Obsidian

+0

@Obsidian не' list' не является списком ключевых слов – helloV

+1

является именем встроенной команды. Вы можете переопределить его, но это не рекомендуется. –

ответ

14

Это самый простой способ сделать это:

a = [1, 2, 2, 3] 
b = [] 
for i in a: 
    if i not in b: 
     b.append(i) 
print (b) 
[1, 2, 3] 
+0

Вопрос в чем проблема с кодом? Не спрашивайте новое решение. – helloV

+1

@helloV Мое понимание OP заключается в том, чтобы ответить на проблему, которая: Напишите функцию, которая принимает список ввода и возвращает новый список, который содержит только уникальные элементы (Элементы должны появляться только один раз в списке и порядок элементов должен быть сохранен как исходный список.). –

3

Проблема с кодом является то, что вы зацикливаете length раз, но проверяете list[i] с list[i+1], таким образом получаете доступ к элементу за конец списка ввода (например, в списке с 6 элементом имеется 6-1 = 5 пар последовательных элементов).

Вторая проблема с вашим кодом заключается в том, что ввод только с одним элементом [1] должен давать в качестве вывода [1], даже если этот элемент не отличается от любого другого. Текст ввода означает, что вы должны удалить элементы, которые равны другим уже присутствующим элементам, а не то, что вы должны хранить элементы, отличные от следующего.

Другой проблема заключается в том, что вы проверяете только для последовательных дубликатов, т.е. учитывая список входного [1, 2, 1, 2] ваша логика не обнаруживает какие-либо дублирования ... похоже упражнение вместо требует в данном случае в качестве выхода [1, 2].

Трассировка для простого алгоритма, чтобы сделать это

for each element in input 
    if the element has not been included in output 
     add the element to the end of output 

Заметим также, что для проверки, если элемент присутствует в списке Python предоставляет оператору in (например if x in output: ...), который может спасти вас явный цикл для этой части.

В качестве побочной заметки, указывающей входной параметр list, считается неправильной практикой в ​​Python, потому что list - это имя предопределенной функции, и ваш параметр скрывает ее.

1

реализации Одна линия:

list = [100, 3232, 3232, 3232, 57, 57, 90] 
new_list = [] 

[new_list.append(x) for x in list if x not in new_list] 

print(new_list) 

Печать:

[100, 3232, 57, 90] 
+1

Плохая идея использовать понимание списка, чтобы избежать лишних строк регулярного цикла 'for' и' if'. Вы создаете дополнительный список значений «Нет», чтобы снова выбросить его. – Blckknght

1

О (п) раствор без использования набора:

>>> from collections import Counter, OrderedDict 
>>> class OrderedCounter(Counter, OrderedDict): 
...  pass 
... 
>>> lst = [1, 2, 2, 3, 4, 5, 4] 
>>> [x for x,c in OrderedCounter(lst).items() if c==1] 
[1, 3, 5] 
1

Проблематика линия>, если (список [i]! = list [i + 1]): < (6-я строка в вашем коде).

Причина: Представьте, что ваш список имеет 4 элементов.

Например: mylist = [1, 2,2,3].

MyList [я]! = MyList [я + 1]

В последней итерации 'я' будет 4, поэтому я + 1 будет 5.

В этом списке нет такого 5-го индекса, , потому что индексы индексов подсчитываются с нуля.

MyList [0] = 1

MyList [1] = 2

MyList [2] = 2

MyList [3] = 3

MyList [4] = нет Индекс

MyList [5] = нет Индекс

def unique_elements (list): 
     new_list = [] 

    # Replace the while with a for loop** 

     for i in list: 
      if i not in new_list: 
      new_list.append(i) 


     return (new_list) 

    #Main program 
    n = int(input("Enter length of the list: ")) 
    list = [] 
    for i in range (0, n): 
     item = int(input("Enter only integer values: ")) 
     list.append(item) 
    print ("This is your list: ", list) 
    result = unique_elements (list) 
    print (result) 
1
l = [1, 2, 2, 3,4,5,6,5,7,8] 
myList = [] 
[ myList.append(item) for item in l if item not in myList] 
print(myList) 
0

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

elements = [1, 2, 3, 3, 5, 7, 8, 7, 9] 
unique_elements = {element for element in elements} 
print(unique_elements) 
Смежные вопросы