生成固定长度的随机字符串,其中禁止某些值

时间:2016-03-08 22:15:20

标签: python python-2.7 random

在Python 2.7中,如何最有效地生成len=3的唯一随机字符串 - 仅由数字组成 - 其中列表中包含的值(称为exclude_me不被视为而正在计算随机字符串?

E.g。 exclude_me=['312','534','434','999',...........,'123']

5 个答案:

答案 0 :(得分:1)

只有1000个数字,您也可以只列出一个没有排除的数字,然后从中随机选择:

import random

numbers = range (111,1000)
exclude_me = [313,534,434,999,123]
difference = set(numbers).difference(set(exclude_me))
candidates = list(difference)
str(random.choice(candidates))

答案 1 :(得分:1)

如果排除列表很短,重复随机选择直到不排除结果将是最有效的方法:

excluded = set(int(x) for x in exclude_me)

while True:
    candidate = random.randint(0, 999)
    if candidate not in excluded:
        result_int = candidate
        break

result = '{:03d}'.format(result_int)

另一方面,如果排除列表很长,您可以通过准备一组符合条件的值来避免循环多次迭代:

included = set(range(1000)) - excluded
result_int = random.choice(list(included))

答案 2 :(得分:1)

如果exclude_me列表的目的是通过存储已生成的数字来防止重复的数字,您可以创建有效数字的初始列表,随机随机播放列表,然后在需要时弹出一个项目一。这样您就不需要并行列表来跟踪那些已经生成的值,并且大部分工作都在初始设置中。

import random

population = ['{:03d}'.format(i) for i in range(1000)]
random.shuffle(population)

# get 10 unique numbers
for i in range(10):
    print(population.pop())

对于1000个数字,这种事情是可行的。对于非常大的列表可能不太好。

答案 3 :(得分:0)

您可以声明大约1000个字符串的固定列表(即['000', '001', ..., '999'],省略您喜欢的任何值,然后在该列表上调用random.choice()

如果您不想输入1000个字符串,则可以使用range()然后.remove()禁用值以编程方式生成列表。

答案 4 :(得分:-1)

这是一种非常简单(但效率不高)的方法:

import random

digits = '0123456789'
blacklist = set(['312','534','434','999',...........,'123'])

answer = '312'
while answer in blacklist:
    answer = ''.join([str(i) for i in (random.choice(digits) for _ in range(3))])

另一种同样效率低下的方式:

import itertools
import random

digits = '0123456789'
blacklist = set(['312','534','434','999',...........,'123'])

options = [i for i in itertools.combinations_with_replacement(digits, 3) if i not in blacklist]
answer = random.choice(options)