从排序列表中打印唯一号码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 

例如所有值只能连续出现一次。

+0

Martijn的代码是非常有效的,但是(像你的代码)它假定'alist'已经被排序。 –

+1

@MartijnPieters OP的结果只包括不重复的项目。太糟糕了,这个问题没有得到很好的传达。所以与欺骗链接并不能真正解决他们的问题。你提出的解决方案的一个稍微修改的扩展名是:'print [k for k,g in groupby(randomlist)if len(list(g))== 1]' –

+0

@MosesKoledoye:对,是,OP完全归咎于不包括明确的问题陈述。 –

你可以做这个:

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秒。

+3

所以不要回答,标记为重复。而你的第二个解决方案需要O(NK)时间,因为'unique_list'被反复扫描以测试成员资格。 –

+0

我仍然喜欢这个答案,很确​​定OP可以从中学到很多 – RoadRunner

+0

感谢信息,@ 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