我正在尝试打印排序列表中仅出现一次的所有元素。
我的代码可以使用,但我确信有更好的方法:
1*1=1
1*1*2=2
1*1*2*3=6
1*1*2*3*4=24
这会产生
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)
e.g。所有只出现一次的值。
答案 0 :(得分:3)
您可以使用itertools.groupby()
function对输入进行分组,并对一个元素长的组进行过滤:
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
您可能希望将print
语句替换为yield
并将打印保留给来电者:
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
答案 1 :(得分:-1)
这个问题似乎有重复。
如果您不希望保留列表的顺序,可以执行
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秒。 (在使用random.random()
生成的列表上)
答案 2 :(得分:-3)
print (set(YOUR_LIST))
或者如果您需要列表,请使用:
print (list(set(YOUR_LIST)))
答案 3 :(得分:-4)
集合是包含唯一项目的列表。如果从数组构造一个集合,它将只包含唯一的项目:
def print_unique(alist):
print set( alist )
输入列表无需排序。