list1 = [1,2,3,4]
需求:显示这个list,然后让人选,输出选择的结果,选过的不要再选了
(隐含需求:防止用户胡乱输入)
其实面对这个需求,不是特别明确,会产生以下3种需求:
需求1:用户选择后,显示的时候还是1,2,3,4,选择的时候提示已经输过了
需求2:用户选择后(比如选择1),显示的是2,3,4,原始内部数据是,2,3,4,输入提示已经输入过了
需求3:用户选择后(比如选择1),显示的是2,3,4,原始内部数据还是1,2,3,4,输入提示已经输入过了
面对需求1:我们只要造一个集合出来,把已经选择的放进去,然后用户输入的时候,判断在不在里面就行了
面对需求2:我们可以使用pop这个方法,一箭双雕,一方面拿到数据,一方面剔除源数据
但是这样会导致一个问题,你无法防止用户胡乱输入!!!
因为用户胡乱输入的时候 ,你用的是in,但是pop之前剔除过了,所以面对list1 =[2,3,4]的时候,
用户选择1,你就会很难受,除非你引入更复杂的逻辑,否则没有办法区别1到底是不在还是胡乱输入的
(——————这里想到更复杂逻辑的方法了!!!后面说)
但是需求2仍然有借鉴意义,比如,我们抽奖的时候,奖池是可以用这个方法实现一箭双雕的
还有抽牌,打牌的时候,都可以用pop,非常好用!!!
面对需求3:这个一方面显示的时候要是删除过的,一方面因为为了防止胡乱输入,还不能动源数据:
此时创建两个列表,一个用来存放已经选择过的selected,一个用来遍历源数据list1,当item在selected的时候
就不放进去list,不在的时候放进list
遍历这个list,如果item 在selected集合中,跳过这个循环,否则的话添加这个元素进list
最后用”,”join一下这个list,这样的话合成的字符串,你最后来个print就可以
list1 = [1,2,3,4]
selected = {}
list = []
while True:
for item in list1:
if item in selected:
continue
list.append(item)
str = ','.join(list)
if not str:
print('你已经选完了,不能再选了')
break
user = int(input('以下数字供您选择:{},请选择一个数'.format(str)))
if user not in list1:
print('选择超出范围')
continue
if user in selected:
print('你已经选择过了')
continue
在不使用一个删除的情况下,完成这个需求!!!非常好用
—————后续再看需求3的这个方法,觉得不好,完全可以不用遍历和创建,仅用2个变量完成
list1 = [1,2,3,4]
selected = set()
while True:
if not list1:
break
print('以下数据供您选择:{}'.format(list1))
userinput = int(input('请选择您需要输入的数据:'))
if userinput not in list1:
if userinput not in selected:
print('选择超出范围')
continue
print('您已经选过了')
continue
selected.add(list1.pop(list1.index(userinput)))