我正在尝试创建一个小型Python程序,在课程中调用随机学生,然后将该学生从列表中删除,直到所有其他学生都被调用。
示例:
- ME
- 您
- 其他
醇>
我想随机调用一个,然后将其从列表中删除,以便下一次只有
- 你
- 其他
醇>
我已经编写了这段代码,但它一直在重复学生,而没有先打电话给所有学生。
import random
klasa = {1 :'JOHN', 2 : 'Obama' , 3 : 'Michele' , 4 : 'Clinton'}
ran = []
random.seed()
l = random.randint(1,4)
while l not in ran:
ran.append(l)
print(klasa[l])
for x in ran:
if x != None:
ran.remove(x)
else:
break
答案 0 :(得分:1)
您可以采取两种方法。一种是在字典中有一个键列表,从该列表中随机选择一个键然后将其删除。这看起来像这样:
from random import choice
keys = klasa.keys()
while keys: #while there are keys left in 'keys'
key = choice(keys) #get a random key
print("Calling %s" % (klasa.pop(key))) #get the value at that key, and remove it
keys.remove(key) #remove key from the list we select keys from
除了删除它之外, klasa.pop(key)
将返回与该键相关联的值:
| pop(...)
| D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
| If key is not found, d is returned if given, otherwise KeyError is raised
另一种方法是先手动调整密钥列表,然后遍历每个密钥列表,即:
from random import shuffle
keys = klasa.keys()
shuffle(keys) #put the keys in random order
for key in keys:
print("Calling %s" % (klasa.pop(key)))
如果您想一次删除一个人,您可以这样做:
print("Calling %s" % klasa.pop(choice(klasa.keys())))
虽然这意味着您每次都会生成一个键列表,但最好将其存储在列表中,并在删除它们时从该列表中删除键,就像在第一个建议的方法中一样。 keys = .keys() ... a_key = choice(keys), klasa.pop(key), keys.delete(key)
注意:在python 3.x中,你需要keys = list(klasa)
,因为.keys
没有返回像2.x这样的列表
答案 1 :(得分:0)
我试图简化:
>>> klasa = ['JOHN', 'Obama' , 'Michele' , 'Clinton']
>>> random.seed()
>>> l = len(klasa)
>>> while l > 0:
... i = random.randint(0,l-1)
... print (klasa[i])
... del klasa[i]
... l=len(klasa)
...
Michele
JOHN
Obama
Clinton
>>>
答案 2 :(得分:0)
根据您的需要修改此解决方案
from random import *
klasa = {1 :'JOHN', 2 : 'Obama' , 3 : 'Michele' , 4 : 'Clinton'}
#Picks a random Student from the Dictionary of Students
already_called_Student=klasa[randint(1,4)]
print "Selected Student is" , already_called_Student
total_Students = len(klasa)
call_student_number = 0
while call_student_number < total_Students:
random_student=klasa[randint(1,4)]
if random_student == already_called_Student:
continue
print random_student
call_student_number = call_student_number + 1