我被要求创建一个方法,该方法返回列表中给定项目的出现次数。我知道如何编写代码来查找特定项目,但是如何将其编码到计算随机项目出现次数的位置。
例如,如果我有list [4, 6 4, 3, 6, 4, 9]
并输入类似
s1.count(4)
,应该return 3
或s1.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)
答案 0 :(得分:3)
如果此列表已经排序,那么“最有效”的方法 - 就Big-O而言 - 将是如果找到该值,则使用count-forward / count-backward执行二进制搜索。
但是,对于示例中的未排序的列表,则计算出现次数的唯一方法是依次遍历每个项目(或先排序;-)。这是一些伪代码,请注意它比原始帖子中提供的代码更简单(没有if x in list
或count[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