这个代码Python 3.3出了什么问题

时间:2013-11-30 10:25:32

标签: python random random-seed

我正在尝试创建一个小型Python程序,在课程中调用随机学生,然后将该学生从列表中删除,直到所有其他学生都被调用。

示例:

  
      
  1. ME
  2.   
  3.   
  4. 其他
  5.   

我想随机调用一个,然后将其从列表中删除,以便下一次只有

  
      
  1.   
  2. 其他
  3.   

我已经编写了这段代码,但它一直在重复学生,而没有先打电话给所有学生。

    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

3 个答案:

答案 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