这是我到目前为止所做的:
def lists():
global ClientList, highList, moderateList
ClientList = [ ["NeQua,High"],
["ImKol,Moderate"],
["YoTri,Moderate"],
["RoDen,High"],
["NaThe,Moderate"],
["ReWes,Moderate"],
["BrFre,High"],
["KaDat,High"],
["ViRil,High"],
["TrGeo,High"]]
highList = ["Running", "Swimming", "Aerobics", "Football", "Tennis"]
moderateList = ["Walking", "Hicking", "Cleaning", "Skateboarding", "Basketball"]
checkclient()
def checkclient():
global ClientList, highList, moderateList
answer = input("please enter the client ID: ")
answer2 = next(answer for answer in ClientList)
print(answer)
所以我想输入特定的clientID,我希望python然后在列表中找到客户端ID,打印带有强度级别(高或中等)的clientID,这样我以后可以用它来询问用户多少分钟他们根据自己的强度是高还是中等,在不同的活动中度过。
目前代码只打印列表的第一部分,无论变量答案是什么:[“NeQua,High”]。
请告诉我如何解决这个问题并尽量保持简单,因为我对Python比较陌生。
由于 卡梅伦
答案 0 :(得分:1)
使用字典(并且不需要将其包装在除了创建全局对象之外什么都不做的函数中)。
ClientList = {"NeQua":"High",
"ImKol":"Moderate",
"YoTri":"Moderate",
"RoDen":"High",
"NaThe":"Moderate",
"ReWes":"Moderate",
"BrFre":"High",
"KaDat":"High",
"ViRil":"High",
"TrGeo":"High"}
如果您想要做的就是改变它们,则不需要将list
或词典等可变对象指定为global
。如果您希望将同名的本地分配也分配给全局名称,则只需global
。但更重要的是,next()
只返回迭代中的下一个元素。由于list
是一个有序序列,您使用answer for answer in ClientList
生成的生成器将具有相同的顺序,并且next()
(冗余,我可能添加)生成器将{永远是ClientList
的第一个元素,因为你不断创造一个新的发电机。如果你希望next()
继续完成整个事情,你必须先保存它。但是,这里没有必要这样做。只需访问字典。我在这里使用get()
以避免在用户尝试访问不存在的用户时出错。
def checkclient():
answer = input("please enter the client ID: ")
print(ClientList.get(answer, 'Not found.'))
checkclient()
另请注意,在调用之前必须定义一个函数(顺序很重要)。
答案 1 :(得分:0)
您可以按如下方式更改它:
def checkclient():
global ClientList, highList, moderateList
answer = input("please enter the client ID: ") # input: NaThe
try:
answer2 = next(a for a in ClientList if answer in a)
except StopIteration:
checkclient()
else:
print(answer2) # NaThe,Moderate
next
会返回iterable的第一个元素,因此您始终会获得ClientList
的第一个元素,因此您需要过滤掉包含您ID的元素。