我需要获取用户输入以生成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'
答案 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)
有两种方法可以解决这个问题:
循环浏览列表以检查每个元素。
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
如果您可以将该检查添加到代码中,则可以解决问题。
使用其他方式跟踪已添加的元素
选项包括dict
或int
的位。
例如,创建checks = {}
。向列表中添加值时,请设置checks[usrNum] = True
。然后checks.get(usrNum, False)
将返回一个布尔值,指示该数字是否已存在。您可以使用collections.DefaultDict
来简化此操作,但我怀疑它可能比您准备好的更先进。
第一个可能是你的导师所追求的结果,所以我会给你一个简单的版本来处理和按摩以满足你的需要。
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)