繁体   English   中英

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

[英]Count the number of occurrences of a given item in a (sorted) list?

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

例如,如果我有一个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)

如果此列表已经排序,则按照Big-O的“最有效”的方法将是执行二进制搜索,如果找到该值,则使用向前计数/向后计数。

但是,对于示例中未排序的列表,唯一计算出现次数的方法是依次遍历每个项目(或首先对它进行排序;-)。 这是一些伪代码,请注意,它比原始文章中介绍的代码更简单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 4 2 4 3 8 2 1 4 2 4 9 7 4

您将首先no fours yet记得no fours yet ,并为等于4的每个元素加1。要遍历列表,可以使用for语句 给定列表el的元素,您可以检查是否为四个,例如:

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

回应您的编辑:

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

将数字相加时,只需编写num += 1 仅当您要访问列表或字典的值时,才需要使用方括号。

另外,不要忘了在函数末尾return num ,以便有人调用它返回结果。

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

实现O(log n)的方法是使用2个二进制搜索(给出O(2log n),但是我们丢弃常量,因此仍然是O(log n))被修改为没有相等性测试,因此,所有搜索都将失败。 但是,如果搜索失败(低>高),则返回低。

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

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

无论如何,这似乎是一项作业。 尝试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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM