计算一次出现的列表条目数

时间:2015-10-07 00:29:14

标签: python arrays list loops unique

我试图编写一个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)

5 个答案:

答案 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.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)

答案 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))