【问题标题】:Checking if value is in a list without using "in"检查值是否在列表中而不使用“in”
【发布时间】:2020-09-11 11:52:08
【问题描述】:

我想编写一个函数来检查“值”是否在列表中。我想出了一种使用“in”的方法,但现在我想找到一种不使用它的方法。

我的代码如下所示:

def is_member(value, l):
    if value in l:
        print("is member")
        return True
    else: 
        print("not member")
        return False

它适用于所有这些断言

assert is_member(2, [1, 2, 3])
assert not is_member(0, [1, 2, 3])
assert is_member('C', 'CATG')
assert not is_member('U', 'CATG')

在不使用“in”的情况下,我可以通过什么方式(以简单的初学者方式)实现相同的目标?

【问题讨论】:

  • 是什么原因?
  • @JanStránský 练习
  • 练习什么?练习这个的原因是什么?我只是好奇

标签: python string list


【解决方案1】:

使用count

它给出了一个项目在列表中出现的次数

如果计数 > 0,则表示特定项目在列表中!

代码:

def is_member(value, l):
    if l.count(value)>0:
        print("is member")
        return True
    else: 
        print("not member")
        return False
assert is_member(2, [1, 2, 3])
assert not is_member(0, [1, 2, 3])
assert is_member('C', 'CATG')
assert not is_member('U', 'CATG')

【讨论】:

  • 我认为这是为了理解较低级别的编程模式而使用尽可能原始的方法做某事的练习。用count 替换in 几乎不能实现这个目标,只是更加模糊。
  • @Kuldeep 是的,有效!您能简要解释一下 count 的作用吗?
  • @deceze 你猜对了。那么有没有更简单的方法呢?
  • @SanchoPanza 我已经添加了解释!
  • @KuldeepSinghSidhu 谢谢!有没有更基本的方法来做到这一点?看起来 deceze 的意思是说有。
【解决方案2】:

更原始的模式,以及 in 以某种形式间接在幕后所做的事情是:

def is_member(value, l):
    for i in l:
        if value == i:
            print("is member")
            return True

    print("not member")
    return False

您遍历所有值,将它们与搜索到的值进行比较,如果找到匹配项,则return True 并结束您的函数。如果函数在没有找到匹配项的情况下从列表末尾运行,它将是return False

更原始:

it = iter(l)
while True:
    try:
        i = next(it)
    except StopIteration:
        print('not member')
        return False

    if i == value:
        print('is member')
        return True

这基本上展开了for .. in 循环所做的事情:它创建一个迭代器 并获取它的next 值,直到它引发StopIteration

【讨论】:

  • 但不是那个 in。这是for .. in,而不是value in l。您必须真的向后弯曲,以完全避免使用关键字“in”来迭代该列表。
  • @SanchoPanza 不,它没有。
  • @SanchoPanza 在print 中还有一个in。不知道有没有问题。
  • @deceze 或while 循环代替for 循环。但你是对的,你没有使用 that 。无论如何,老实说,我不太关心这些“不使用 Y 做 X”的问题,无论它们是否设置用于个人练习或课堂练习。
  • @deceze 好吧,至少我想这有助于理解为什么涉及 count 的其他答案在早期比赛中是一个糟糕的答案...
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
相关资源
最近更新 更多