如何限制域名生成器输出数量并随机化结果?
解决Python域名生成脚本的随机化与数量限制问题
核心思路
- 先读取词汇文件生成完整的域名候选列表(或生成迭代器后转列表)
- 对列表执行随机打乱操作,打破
itertools默认的有序生成逻辑 - 通过列表切片截取指定数量的结果输出
完整代码示例
import itertools import random # 1. 读取Combined.txt中的词汇,过滤空行和无效字符 with open('Combined.txt', 'r', encoding='utf-8') as f: words = [line.strip() for line in f if line.strip()] # 2. 生成域名组合(以两两不重复组合为例,可按需调整) # 若需要允许重复的组合,替换为itertools.product(words, repeat=2) domain_candidates = [f"{w1}{w2}.co.id" for w1, w2 in itertools.combinations(words, 2)] # 3. 随机打乱候选列表(这一步是解决有序问题的关键) random.shuffle(domain_candidates) # 4. 限制输出数量为100个,若候选总数不足则返回全部 limited_domains = domain_candidates[:100] # 5. 在Jupyter Notebook中展示结果 for domain in limited_domains: print(domain)
关键细节说明
- 读取文件时过滤空行:避免因文件中的空白行生成无意义的域名
- 选择合适的
itertools方法:itertools.combinations(words, n):生成不重复的n个词汇组合(如abc+def,不会出现def+abc)itertools.product(words, repeat=n):生成允许重复的n个词汇组合(如abc+abc、abc+def和def+abc都会生成)- 可自行调整
n的值来生成不同长度的域名组合
- 随机化失效的原因:
itertools生成的是有序迭代器,必须先转换为列表再执行random.shuffle(),直接对迭代器操作无法实现打乱效果 - 数量限制逻辑:通过
[:100]切片直接截取前100个结果,若候选总数不足100则自动返回全部内容
内存优化方案(针对大词汇量场景)
如果Combined.txt词汇量极大,生成完整候选列表会占用过多内存,可改用随机抽样方式:
import itertools import random with open('Combined.txt', 'r', encoding='utf-8') as f: words = [line.strip() for line in f if line.strip()] # 生成迭代器而非列表,节省内存 domain_iter = (f"{w1}{w2}.co.id" for w1, w2 in itertools.combinations(words, 2)) # 转换为列表后随机抽取100个(若总数不足则返回全部) domain_list = list(domain_iter) limited_domains = random.sample(domain_list, min(100, len(domain_list))) for domain in limited_domains: print(domain)
内容的提问来源于stack exchange,提问作者Tsukuru
相关产品推荐
相关产品推荐

