如何只检查一次支票?

时间:2016-09-11 04:47:43

标签: python python-2.7

所以我有这个问题,我必须做家庭作业。

接下来,写下ind(e,L)。这是它的描述:

写入ind(e,L),其接收序列L和元素e。 L可能是一个字符串,或者更一般地说,是一个列表。你的函数ind应该返回在L中首次找到e的索引。从列表开始,计数从0开始。如果e不是L的元素,则ind(e,L)应该返回等于len(L)的整数。以下是一些例子:

ind(42, [ 55, 77, 42, 12, 42, 100 ]) returns 2
ind(42, range(0,100)) returns 42
ind('hi', [ 'hello', 42, True ]) returns 3
ind('hi', [ 'well', 'hi', 'there' ]) returns 1 
ind('i', 'team') returns 4 
ind(' ', 'outer exploration') returns 5

在最后一个例子中,ind的第一个输入是一个单个空格字符的字符串,而不是空字符串。

提示:正如您可以检查元素是否在

序列中一样

如果是L: 您还可以检查元素是否不在

序列中

如果e不在L中: 后一种语法对ind函数很有用!与dot一样,ind可能与类示例中的mylen最相似。

这里是我为这个问题编写的许多代码之一。

def ind( e, L):
  num = 0
  if e not in L and num == 0:
    return len(L)
  else:
    if e == L[0]:
      num += 1 + ind( e, L[1:] )
      return num
    else:
      return ind( e, L[1:] )

所以问题是每次e都不在列表中。它占用列表其余部分的长度并将其添加到num。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

当按顺序处理指标时,Python有一个很好的内置命名enumerate,它有助于以简洁的方式跟踪索引。

  

返回枚举对象。 sequence必须是序列,迭代器或支持迭代的其他对象。 next()返回的迭代器的enumerate()方法返回一个包含计数的元组(从start开始,默认为0)和迭代序列获得的值

样品:

seq = ['hello', 42, True]
for index, obj in enumerate(seq):
    print index, obj

输出:

0 hello
1 42
2 True

我们可以使用它来显着简化处理。由于我们可以迭代L并检索当前元素的索引和值,因此我们现在必须与请求的值进行比较。当找到值时,我们可以简单地返回它并跳过搜索序列的其余部分

def ind(e, L):
    for index, value in enumerate(L):
        if value == e:
            return index

现在缺少的是没有找到值的情况,但添加对它的支持非常简单:

def ind(e, L):
    for index, value in enumerate(L):
        if value == e:
            return index
    return len(L)  # this will be executed only if any value wasn't found earlier

它通过所有测试用例:

assert ind(42, [ 55, 77, 42, 12, 42, 100 ]) == 2
assert ind(42, range(0,100)) == 42
assert ind('hi', [ 'hello', 42, True ]) == 3
assert ind('hi', [ 'well', 'hi', 'there' ]) == 1 
assert ind('i', 'team') == 4 
assert ind(' ', 'outer exploration') == 5

奖励,使用Python提供的所有技巧:

def ind(e, L):
    return next((idx for idx, obj in enumerate(L) if obj == e), len(L))

在搞清楚这里发生的事情时玩得开心:)

答案 1 :(得分:0)

  

在这里(!)曾经(!)我为这个问题编写了很多代码。

你应该更多地关注你正在写的东西,也可能是你正在编码的东西。

除非明确要求您为此任务编写递归函数,否则我会反对。

尝试将任务分解为较小的子问题。其中一些已经解决了:

  • 如果元素未包含在列表中,则返回列表的长度(完成)
  • 循环遍历列表,跟踪当前索引
    • 如果当前列表元素是您要查找的元素,则返回当前索引
    • 否则,请查看下一个元素
  • 因为一旦你进入循环就可以确定元素在列表中(为什么?),你就完成了。

如果你必须以递归方式进行,那么"提示"相当误导。 not in语法无效。你看过mylen函数了吗? 我想它看起来像

def mylen(s):
  if not s:
    return 0
  return 1 + mylen(s[1:])

现在,找到给定元素的(第一个)索引:

 def ind(e, l):
   if not l:        # list is exhausted, element was not found
     return 0
   elif l[0] == e:  # element found
     return 0
   else             # element not found yet
     return 1 + ind(e, l[1:])