我遇到了这方面的问题,无法弄清楚为什么我的代码无效。有人可以帮我解决这个问题吗?我做了这个:
def f8(a_list, n):
"""
The parameter a_list is a list of int's. The parameter n is an int.
The function f8() should return a list that contains exactly one
of each number in a_list that occurs less than n times in a_list.
Example:
f8([1, 1, 7, 7, 7, 3, 3, 3, 4, 4, 4, 5, 5], 3) should return
[1, 5] (as 1 and 5 are the only numbers that occur less than 3
times in a_list)
"""
k = []
for i in a_list:
if i < a_list.count(n):
k.append(i)
return k
print f8([1, 7, 7, 3, 3, 3, 4, 4, 5], 2)
我希望它应该打印[1,5],但它只给我一个无。这是为什么?有人可以帮帮我吗?我被困在这里。
答案 0 :(得分:3)
你有counting
错误的方法!您需要计算i
的出现次数,并将其与n
进行比较。此外,您需要将return
移到for-loop
之外。最后,要删除最终list
中的重复项,我们应该遍历set(a_list)
,以便我们只遍历unique
elements
。关于这一点的巧妙之处在于,由于我们正在计算原始a_list
中的出现次数,因此我们不需要创建任何副本或任何繁琐的内容来处理此问题。
这会使您的function
:
def f8(a_list, n):
k = []
for i in set(a_list):
if a_list.count(i) < n:
k.append(i)
return k
如果我们给它一个测试,它会起作用:
>>> f8([1, 1, 7, 7, 7, 3, 3, 3, 4, 4, 4, 5, 5], 3)
[1, 5]
>>> f8([1, 1, 2, 2, 2, 2, 4, 5, 6, 7, 7, 7, 7], 3)
[1, 4, 5, 6]
注意,如果您想缩短function
,可以在one line
list-comprehension
中获得相同的结果:
def f8(a_list, n):
return [i for i in set(a_list) if a_list.count(i) < n]
给出与上述测试相同的输出。
答案 1 :(得分:1)
首先,您不应该反复拨打count
。每次调用都会迭代整个列表。您可以使用collections.Counter
一次性获取所有计数。其次,您需要检查之前是否添加了任何元素以避免重复,只需调用set
一个a_list
将无法保证外观顺序:
from collections import Counter
def f8(a_list, n):
c = Counter(a_list)
k, seen = [], set()
for x in a_list:
if c[x] < n and x not in seen:
seen.add(x)
k.append(x)
return k
答案 2 :(得分:0)
永远不会满足代码中append
的条件,因此,不会返回任何值。相反,在循环结束后返回。此外,您的计算条件相反,因为您应该在列表中找到i
的计数,而不是n
:
k = []
for i in a_list:
if a_list.count(i) < n and i not in k:
k.append(i)
return k
您收到None
的原因是return语句没有通过,所以为了在函数调用期间满足变量存储,返回None
。