作为在线编程课程(6.00.1x)的一部分,我被要求(Quiz p8)创建一个功能satisfiesF(L)
,可以就地L
进行过滤使用f
,然后返回L
的长度。
f
是为我定义的函数,它返回True
应保留在列表中的项目我已经为这个问题编写了2个解决方案,测试了它们并提交了它们,但两者都被拒绝了。没有提供任何理由,因为该问题旨在测试我们提出自己的测试用例的能力。出于这个原因,请不要提供工作代码,而是让我大致了解出了什么问题。我现在看到了三种主要的可能性:
以下是我的2个解决方案:
def satisfiesF(L):
L[:] = [i for i in L if f(i)]
return len(L)
def satisfiesF(L):
i = 0
while len(L) > i:
if f(L[i]): i += 1
else: L.pop(i)
return len(L)
以下是问题的完整描述:
编写一个名为
satisfiesF
的Python函数,该函数具有该规范 下面。然后进行函数调用run_satisfiesF(L, satisfiesF)
。您的 代码应如下所示:def satisfiesF(L): """ Assumes L is a list of strings Assume function f is already defined for you and it maps a string to a Boolean Mutates L such that it contains all of the strings, s, originally in L such that f(s) returns True, and no other elements. Remaining elements in L should be in the same order. Returns the length of L after mutation """ # Your function implementation here run_satisfiesF(L, satisfiesF)
例如,对于您自己的
satisfiesF
测试,请参阅以下测试函数f
和测试代码:def f(s): return 'a' in s L = ['a', 'b', 'a'] print satisfiesF(L) print L
应打印:
2 ['a', 'a']
在下面的框中粘贴整个函数
satisfiesF
,包括定义。定义函数后,对run_satisfiesF(L, satisfiesF)
进行函数调用。不要定义f
或run_satisfiesF
。不要留下任何调试打印语句。对于这个问题,您将无法看到我们运行的测试用例。此问题将测试您是否有能力提出自己的测试用例。
而且,为了完整起见,这是我最新的一组测试(我正在使用doctest
):
>>> L = ['bat', 'cat', 'dog', 'elephant']
>>> satisfiesF(L) == len([i for i in L if f(i)])
True
>>> [i for i in L if not f(i)]
[]
>>> L = ['ab', 'b', 'ac']
>>> satisfiesF(L)
2
>>> L
['ab', 'ac']
>>> L = ['a', 'a', 'b']
>>> satisfiesF(L)
2
>>> L
['a', 'a']
>>> L = ['a', 'a', 'a']
>>> satisfiesF(L)
3
>>> L
['a', 'a', 'a']
>>> L = ['b', 'c', 'd', 'a']
>>> satisfiesF(L)
1
>>> L
['a']
这些测试使用问题中建议的def f(s): return 'a' in s
。我没有使用f
的其他函数进行测试,但我认为这不会影响结果。
我尝试用satisfiesF(L)
替换run_satisfiesF(L, satisfiesF)
,但测试仍然通过。
Other questions about 6.00.1x Quiz p8
证明我并不疯狂: