如何在python的列表中找到唯一元素?(不使用 set)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/35533344/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to find unique elements in a list in python? (Without using set)
提问by Karan Thakkar
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. ).
编写一个函数,它接受一个输入列表并返回一个仅包含唯一元素的新列表(元素在列表中只应出现一次,并且元素的顺序必须保留为原始列表。)。
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)
I am stuck with this error:
我被这个错误困住了:
IndexError: list index out of range
IndexError:列表索引超出范围
采纳答案by Joe T. Boka
This is the simplest way to do it:
这是最简单的方法:
a = [1, 2, 2, 3]
b = []
for i in a:
if i not in b:
b.append(i)
print (b)
[1, 2, 3]
回答by 6502
The problem with your code is that you are looping length
times but checking list[i]
with list[i+1]
, thus accessing an element past the end of the input list (e.g. in a list with 6 elements there are 6-1=5 pairs of consecutive elements).
与您的代码的问题是,你是循环length
时间,但检查list[i]
用list[i+1]
,从而访问一个元件过去输入列表的末尾(例如在具有6个单元的明细表,有6-1 = 5成对的连续元素)。
A second issue with your code is that an input with only one element [1]
should give as output [1]
even if this element is not different from any other. The input text means you should remove elements that are equal to other elements already present, not that you should keep elements that are different from the next one.
您的代码的第二个问题是只有一个元素的输入[1]
应该作为输出给出,[1]
即使该元素与任何其他元素没有区别。输入文本意味着您应该删除与已经存在的其他元素相等的元素,而不是您应该保留与下一个不同的元素。
Another issue is that you're only checking for consecutiveduplicates i.e. given the input list [1, 2, 1, 2]
your logic wouldn't detect any duplication... looks like the exercise instead requires in this case as output of [1, 2]
.
另一个问题是,您只检查连续的重复项,即给定输入列表,[1, 2, 1, 2]
您的逻辑不会检测到任何重复项……看起来练习在这种情况下需要作为[1, 2]
.
A trace for a simple algorithm to do this is
执行此操作的简单算法的跟踪是
for each element in input
if the element has not been included in output
add the element to the end of output
Note also that to check if an element is present in a list Python provides the in
operator (e.g. if x in output: ...
) that can save you an explicit loop for that part.
另请注意,要检查列表中是否存在元素,Python 提供了in
运算符(例如if x in output: ...
),可以为该部分保存显式循环。
As a side note naming an input parameter list
is considered bad practice in Python because list
is the name of a predefined function and your parameter is hiding it.
作为旁注,list
在 Python 中命名输入参数被认为是不好的做法,因为list
是预定义函数的名称并且您的参数隐藏了它。
回答by George Petrov
One line implementation:
一行实现:
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)
Prints:
印刷:
[100, 3232, 57, 90]
回答by timgeb
O(n) solution without using a set:
不使用集合的 O(n) 解决方案:
>>> 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]
回答by Fuji Komalan
The problematic line is > if (list[i] != list [i + 1]): < (6th line in your code).
有问题的行是 > if (list[i] != list [i + 1]): < (代码中的第 6 行)。
Reason:Imagine your list has got 4 elements.
原因:想象一下你的列表有 4 个元素。
Eg: mylist = [ 1, 2,2,3].
例如:mylist = [ 1, 2,2,3]。
mylist[i] != mylist [i + 1]
mylist[i] != mylist [i + 1]
In the last iteration 'i' will be 4 , so i + 1 will be 5.
在最后一次迭代中 'i' 将是 4 ,所以 i + 1 将是 5。
There is no such 5th index in that list, because list indexes are counted from zero.
该列表中没有这样的第 5 个索引,因为列表索引从零开始计数。
mylist[0] = 1
我的列表[0] = 1
mylist[1] = 2
我的列表[1] = 2
mylist[2] = 2
我的列表[2] = 2
mylist[3] = 3
我的列表[3] = 3
mylist[4] = No Index
mylist[4] = 无索引
mylist[5] = No Index
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)
回答by Fuji Komalan
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)
回答by Nelson M
You can work this out using sets and set comprehension syntax is in most cases overlooked. Just as lists sets can also be generated using comprehension.
您可以使用集合来解决这个问题,并且在大多数情况下会忽略集合理解语法。正如列表集也可以使用理解生成。
elements = [1, 2, 3, 3, 5, 7, 8, 7, 9]
unique_elements = {element for element in elements}
print(unique_elements)