如何在python中从列表中选择随机名而不重复

时间:2014-01-18 09:42:37

标签: python random non-repetitive

我必须使用random.randint从python 中的列表中随机选择名称。

到目前为止我已经完成了。但我无法弄清楚如何打印它们而不重复。 一些名字在10到15个名字之后重复它们。

请帮帮我。 我不允许使用任何高级功能。我应该使用简单的功能。这是我的计划。

import random
names = [about 150 names]
print([names[random.randint(0, len(names)-1)] for i in range(user_input)])

4 个答案:

答案 0 :(得分:3)

如果您可以破坏性地修改names,只需pop值而不是复制它们。然后他们就不在了,所以你将无法重复。

如果您无法破坏性地修改names,请对副本执行相同的操作:

tmp = names[:]
result = [tmp.pop(random.randrange(len(tmp))) for _ in range(user_input)]

这确实具有二次性能,因为列表中间的每个pop必须将列表的一半移动一个档位。但对于150个名字,这不太可能成为问题。例如,在我的笔记本电脑上,从150个名称中选取100个值需要83微秒。

如果你真的不允许使用randrange,你可以自己写一下:

def randrange(x): return randint(0, x-1)

答案 1 :(得分:1)

这些限制非常愚蠢。我不确定“高功能”是什么,但是在我提供the function in your last question之后你还需要帮助,所以也许不允许函数声明?

但是,如果没有功能,你可以做同样的事情。您只需要跟踪已经使用过的指数。这是另一回事:

indices = []
for x in range(5):
    index = random.randint(0, len(population)-1)
    while index in indices:
        index = random.randint(0, len(population)-1)
    indices.append(index)
names = [population[i] for i in indices]

答案 2 :(得分:0)

假设您只能使用 randint 和基本操作(循环,分配和子列表) - 您可以执行“就地改组技巧”(Fisher Yates的现代版本)来实现这样的结果

copy = names[:]    
for i in xrange( user_input-1, 1, -1 ):
  swap = random.randint(0, i) 
  copy[i],copy[swap] = copy[swap],copy[i]

print copy[ :user_input ]

答案 3 :(得分:-1)

生成与names

长度相同的随机数数组
sortarr = [random.randint(0, 10*len(names)) for i in range(len(names))] 

并根据此新数组

对您的names数组进行排序
names = [name for sa, name in sorted(zip(sortarr, names))]

它的作用是为names分配一些随机数。它们可以重复,但它不会重复名称,因为如果两个数字相同,它们将被分配给一些任意名称。