我试图编写一个Python函数来计算列表中只出现一次的条目数。
例如,给定列表[17],此函数将返回1.或者给定[3,3,-22,1,-22,1,3,0],它将返回1.
**限制:我无法将任何内容导入我的程序。
到目前为止我写的错误代码:我正在进行双循环路由,但索引数学变得过于复杂。
def count_unique(x):
if len(x) == 1:
return 1
i = 0
j = 1
for i in range(len(x)):
for j in range(j,len(x)):
if x[i] == x[j]:
del x[j]
j+1
j = 0
return len(x)
答案 0 :(得分:3)
lst = [3,3,-22,1,-22,1,3,0]
len(filter(lambda z : z[0] == 1,
map(lambda x : (len(filter(lambda y : y == x, lst)), x), lst)))
抱歉:)
您的解决方案不起作用,因为您正在做一些奇怪的事情。在迭代它时从列表中删除东西,j + 1是没有意义的。尝试添加被发现对新列表唯一的元素,然后计算其中的事物数量。然后找出我的解决方案的作用。
这是O(n)解决方案btw:
lst = [3,3,-22,1,-22,1,3,0,37]
cnts = {}
for n in lst:
if n in cnts:
cnts[n] = cnts[n] + 1
else:
cnts[n] = 1
count = 0
for k, v in cnts.iteritems():
if v == 1:
count += 1
print count
答案 1 :(得分:3)
由于您显然无法使用collections.Counter
或sorted
/ itertools.groupby
(其中一个通常是我的解决方案,具体取决于输入是可清除的还是可排序的),只是模拟与Counter
大致相同的行为,计算所有元素,然后计算最后只出现一次的元素数量:
def count_unique(x):
if len(x) <= 1:
return len(x)
counts = {}
for val in x:
counts[val] = counts.get(val, 0) + 1
return sum(1 for count in counts.values() if count == 1)
答案 2 :(得分:2)
一个更简单易懂的解决方案:
l = [3, 3, -22, 1, -22, 1, 3, 0]
counter = 0
for el in l:
if l.count(el) == 1:
counter += 1
这很简单。您迭代列表中的项目。然后,您查看元素是否恰好在列表中一次,然后添加+1。你可以改进代码(制作听觉理解,使用lambda表达式等),但这是所有这一切背后的想法,也是最容易理解的,imo。
答案 3 :(得分:2)
添加到此。在考虑复杂性时,它可能是最好的方法。字典上的in
查询被视为O(1)
,for循环为O(n)
,因此总时间复杂度为O(n)
,这是合乎需要的...使用count() list元素对整个列表中的每个元素进行搜索,这些元素基本上是O(n^2)
...那很糟糕
from collections import defaultdict
count_hash_table = defaultdict(int) # i am making a regular dictionary but its data type is an integer
elements = [3,3,-22,1,-22,1,3,0]
for element in elements:
count_hash_table[element] += 1 # here i am using that default datatype to count + 1 for each type
print sum(c for c in count_hash_table.values() if c == 1):
答案 4 :(得分:1)
There is method on lists called count.... from this you can go further i guess.
for example:
for el in l:
if l.count(el) > 1:
continue
else:
print("found {0}".format(el))