从排序列表中打印唯一号码python
我试图打印所有排序列表中只出现的元素一次。从排序列表中打印唯一号码python
我的代码下面的作品,但我敢肯定有一个更好的方法:
def print_unique(alist):
i = 0
for i in range(len(alist)):
if i < (len(alist)-1):
if alist[i] == alist[i+1]:
i+=1
if alist[i] == alist[i-1]:
i+=1
elif alist[i] == alist[i-1]:
i+=1
else:
print alist[i]
else:
if alist[-1]!= alist[-2]:
print alist[-1]
randomlist= [1,2,3,3,3,4,4,5,6,7,7,7,7,8,8,8,9,11,12,14,42]
print_unique(randomlist)
这将产生
1
2
5
6
9
11
12
14
42
例如所有值只能连续出现一次。
你可以做这个:
print (set(YOUR_LIST))
,或者如果你需要一个列表使用此:
print (list(set(YOUR_LIST)))
集是含有独特的项目清单。如果您从阵列构建一个集合,它将只包含唯一项目:
def print_unique(alist):
print set(alist)
输入列表不需要排序。
这个问题似乎有重复。
如果您不希望保存列表的顺序,你可以做
print list(set(sample_list))
您也可以尝试,
unique_list = []
for i in sample_list:
if i not in unique_list:
unique_list.append(i)
编辑:
为了打印所有在列表中的元素,使它们连续出现一次,你可以试试这个
print '\n'.join([str(i) for i in unique_list])
而且,正如@ martijn-pieters在评论中提到的那样,第一个代码与第二个代码相比是非常快的,当时我做了一个小基准。在10^5个元素的列表中,第二个代码完成了63.66秒,而第一个代码只花了0.2200秒。
所以不要回答,标记为重复。而你的第二个解决方案需要O(NK)时间,因为'unique_list'被反复扫描以测试成员资格。 –
我仍然喜欢这个答案,很确定OP可以从中学到很多 – RoadRunner
感谢信息,@ martijn-pieters。但是,我不能将其标记为与当前声誉重复:) –
您可以使用itertools.groupby()
function,以便将输入和过滤器上的一个元素长属于组(生成使用random.random()
名单上):
from itertools import groupby
def print_unique(alist):
for elem, group in groupby(alist):
if sum(1 for _ in group) == 1: # count without building a new list
print elem
,或者如果你想这样做“手动”,轨道最后一个项可以看出,如果你已经看到了不止一次:
def print_unique(alist, _sentinel=object()):
last, once = _sentinel, False
for elem in alist:
if elem == last:
once = False
else:
if once:
print last
last, once = elem, True
if last is not _sentinel and once:
print last
您可能希望与yield
更换print
语句,并留下打印到来电者:
def filter_unique(alist):
for elem, group in groupby(alist):
if sum(1 for _ in group) == 1: # count without building a new list
yield elem
for unique in filter_unique(randomlist):
print unique
Martijn的代码是非常有效的,但是(像你的代码)它假定'alist'已经被排序。 –
@MartijnPieters OP的结果只包括不重复的项目。太糟糕了,这个问题没有得到很好的传达。所以与欺骗链接并不能真正解决他们的问题。你提出的解决方案的一个稍微修改的扩展名是:'print [k for k,g in groupby(randomlist)if len(list(g))== 1]' –
@MosesKoledoye:对,是,OP完全归咎于不包括明确的问题陈述。 –