计算(已排序)列表中给定项目的出现次数?

时间:2011-11-09 01:02:37

标签: python

我被要求创建一个方法,该方法返回列表中给定项目的出现次数。我知道如何编写代码来查找特定项目,但是如何将其编码到计算随机项目出现次数的位置。

例如,如果我有list [4, 6 4, 3, 6, 4, 9]并输入类似

的内容

s1.count(4),应该return 3s1.count(6) return 2

我不允许使用和内置函数。

在最近的一项任务中,我被要求计算sub string“ou”出现在给定字符串中的次数,我编码了

if len(astr) < 2:
    return 0
else:
    return (astr[:2] == "ou")+ count_pattern(astr[1:])

这样的事情会起作用吗?

def count(self, item):
    num=0
    for i in self.s_list:
        if i in self.s_list:
            num[i] +=1
def __str__(self):
    return str(self.s_list)

4 个答案:

答案 0 :(得分:3)

如果此列表已经排序,那么“最有效”的方法 - 就Big-O而言 - 将是如果找到该值,则使用count-forward / count-backward执行二进制搜索。

但是,对于示例中的未排序的列表,则计算出现次数的唯一方法是依次遍历每个项目(或先排序;-)。这是一些伪代码,请注意它比原始帖子中提供的代码更简单(没有if x in listcount[x]):

set count to 0
for each element in the list:
   if the element is what we are looking for:
      add one to count

快乐的编码。

答案 1 :(得分:2)

如果我告诉你要计算以下列表中的四个数量,将如何做?

1 4 2 4 3 8 2 1 4 2 4 9 7 4

首先记住no fours yet,然后为每个等于4的元素添加1.要遍历列表,可以使用for statement。给定列表el的元素,您可以检查它是否为4:

if el == 4:
  # TODO: Add 1 to the counter here

回复您的修改:

您目前正在测试if i in self.s_list:,这没有任何意义,因为i是列表中的一个元素,因此始终存在于其中。

添加到数字时,您只需编写num += 1即可。只有在您想要访问列表或字典的值时才需要括号。

另外,不要忘记函数末尾的return num,以便有人调用它来获得结果。

答案 2 :(得分:1)

实际上,就Big-O而言,最有效的方法是O(log n)。如果数组由相等的元素组成,@ pst的方法将导致O(log n + s),它可能变为线性。

实现O(log n)的方法是使用2个二进制搜索(它给出O(2log n),但我们丢弃常量,因此它仍然是O(log n))被修改为没有平等测试,因此使所有搜索都不成功。然而,在不成功的搜索(低>高)我们返回低。

在第一次搜索中,如果中间值大于搜索词,则递归到数组的较高部分,否则递归到下半部分。在第二次搜索中,反转二进制比较。

第一次搜索产生相等元素的右边界,第二次搜索产生左边界。只需减去即可获得出现的数量。 基于Skiena中描述的算法。

答案 3 :(得分:0)

这似乎是一个功课......反正。试试list.count(item)。那应该可以胜任。

这里的第三或第四个要素:

http://docs.python.org/tutorial/datastructures.html

编辑:

尝试其他类似的事情:

bukket = dict()
for elem in astr:
    if elem not in bukket.keys():
        bukket[elem] = 1
    else:
        bukket[elem] += 1

现在可以使用dict.keys()作为列表获取列表中的所有元素,并使用dict [key]获取相应的出现。

所以你可以测试一下:

import random

l = []

for i in range(0,200):
    l.append(random.randint(0,20))

print l
l.sort()
print l

bukket = dict()
for elem in l:
    if elem not in bukket.keys():
        bukket[elem] = 1
    else:
        bukket[elem] += 1


print bukket