确定列表中是否存在int,而不使用“in”函数

时间:2016-03-23 20:16:09

标签: list python-3.x

我需要获取用户输入以生成8个数字的列表,但是当他们输入已经在列表中的数字时会打印并出错。不使用in函数来确定它是否在列表中。这是我到目前为止所拥有的。

def main():
    myList = range(9)
    a= True

    for i in myList:
        while a == True:
            usrNum = int(input("Please enter a number: "))

            if usrNum != myList[i]:
                myList.append(usrNum)

            print(i)



main()

上述代码出错,

Scripts/untitled4.py", line 18, in main
    myList.append(usrNum)

AttributeError: 'range' object has no attribute 'append'

3 个答案:

答案 0 :(得分:2)

这个问题似乎是您生成myList的方式。如果您使用myList = [range(9)]生成它,则会获得:

[[0, 1, 2, 3, 4, 5, 6, 7, 8]]

尝试使用简单:

myList = range(9)

此外,您需要使用myList.append[usrNum]更改myList.append(usrNum),否则您将获得:

TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'

您也可以使用wim的建议代替!=运营商:

if myList.__contains__(usrNum):
    myList.append(usrNum)

答案 1 :(得分:1)

有两种方法可以解决这个问题:

  1. 循环浏览列表以检查每个元素。

    in运算符正在有效地执行:

    for each value in the list:
            if the value is what you're looking for
                return True
    if you reach the end of the list:
        return False
    

    如果您可以将该检查添加到代码中,则可以解决问题。

  2. 使用其他方式跟踪已添加的元素

    选项包括dictint的位。

    例如,创建checks = {}。向列表中添加值时,请设置checks[usrNum] = True。然后checks.get(usrNum, False)将返回一个布尔值,指示该数字是否已存在。您可以使用collections.DefaultDict来简化此操作,但我怀疑它可能比您准备好的更先进。

  3. 第一个可能是你的导师所追求的结果,所以我会给你一个简单的版本来处理和按摩以满足你的需要。

    myList = []
    while True:
        usrNum = int(input())
        found = False
        for v in myList:
            if usrNum == v:
                found = True
        if not found:
            myList.append(usrNum)
        else:
            #number was already in the list, panic!
    

    如果你能弄清楚如何做某些方法,那么大多数教师会给人留下更深刻的印象,从而获得更好的成绩。

答案 2 :(得分:1)

您可以执行以下操作,根据需要进行修改(不确定何时/如果您想在用户输入列表中已有的数字时中断,等等。)

这会提示用户输入,直到他们输入列表中已存在的项目,然后它会向用户输出一条消息,然后停止执行。

def main():
    mylist = range(9)
    while True:
        usrNum = int(input("Please enter a number: "))
        if existsinlist(mylist, usrNum):
            print("{} is already in the list {}".format(usrNum, mylist))
            break
        else:
            mylist.append(usrNum)

def existsinlist(lst, itm):
    for i in lst:
        if itm == i:
            return True
    return False

这个家庭作业的重点可能是帮助你理解像in这样的运算符如何比我在existsinlist中使用的显式循环更有效地读取(和编写,编译)。功能

在这种情况下不确定list-comperehension是否允许,但你也可以做这样的事情,而不依赖existsinlist辅助函数:

def main():
    mylist = range(9)
    while True:
        usrNum = int(input("Please enter a number: "))
        if [i for i in mylist if i == usrNum]:
            print("{} is already in the list {}".format(usrNum, mylist))
            break
        else:
            mylist.append(usrNum)

在这种情况下,可以评估列表推导的结果的真实性:

  • 如果不存在匹配值,则会显示[]这样的空列表,这将被视为False
  • 如果存在至少一个匹配值,则会产生非空列表,这将被视为True

另一种短路并且可能更可取的选择:

if any(usrNum == i for i in mylist)