计算出现 1 次的列表条目数
Counting number of list entries that occur 1 time
我正在尝试编写一个 Python 函数来计算列表中恰好出现一次的条目数。
例如,给定列表 [17],此函数将 return 1。或者给定 [3,3,-22,1,-22,1,3,0],它将 return 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)
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) 的解决方案:
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
因为您显然不能使用 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)
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))
更简单易懂的解决方案:
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。
你把事情搞得太复杂了。尝试使用字典,其中键是列表中的元素。这样,如果它存在,它将是唯一的
补充一下。在考虑复杂性时,这可能是最好的方法。 in
在字典上的查找被认为是 O(1)
,for 循环是 O(n)
所以你的总时间复杂度是 O(n)
这是可取的......在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):
我正在尝试编写一个 Python 函数来计算列表中恰好出现一次的条目数。
例如,给定列表 [17],此函数将 return 1。或者给定 [3,3,-22,1,-22,1,3,0],它将 return 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)
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) 的解决方案:
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
因为您显然不能使用 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)
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))
更简单易懂的解决方案:
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。
你把事情搞得太复杂了。尝试使用字典,其中键是列表中的元素。这样,如果它存在,它将是唯一的
补充一下。在考虑复杂性时,这可能是最好的方法。 in
在字典上的查找被认为是 O(1)
,for 循环是 O(n)
所以你的总时间复杂度是 O(n)
这是可取的......在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):