计算出现 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.Countersorted/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):