Python实现的EC2名称生成器输出重复名称如何修复
问题根因
重复输出不是名称生成逻辑导致的,是打印位置写错了。
你把打印整个ec2list的逻辑放在了生成名称的for循环内部:每生成1个新名称追加到列表后,就会把当前列表里存的所有历史名称全部打印一遍。
以输入5个实例为例:
- 第1次循环:列表长度1,打印1行
- 第2次循环:列表长度2,打印2行
- 第3次循环:列表长度3,打印3行
- 第4次循环:列表长度4,打印4行
- 第5次循环:列表长度5,打印5行
累计打印1+2+3+4+5=15行,就是你看到的旧名称反复出现的异常效果。实际上你生成的所有名称本身都是唯一的,不存在重复生成的问题。
问题代码片段定位:
for instance in range(0, amount): randomnum = random.randint(100, 999) randomchar = ''.join(random.choices(string.ascii_letters, k=5)) ec2name = "{}_{}{}{}".format(department, randomnum, randomchar, instance) ec2list.append(ec2name) # 错误点:以下语句在循环体内,每次迭代都会重复打印全部已生成的名称 print("\n".join(ec2list))
修复方法
把打印列表的逻辑移到for循环外部,等所有EC2名称全部生成、列表填充完成后,再一次性打印全部内容即可。
修复后的完整代码:
import random import string print("Welcome to the EC2 unique name generator") print("") depts = ['marketing', 'accounting', 'finops'] ec2list = [] department = input("Please state your department (Marketing, Accounting, FinOps): ").lower() if department not in depts: print("You are not authorized to use this EC2 name generator. ") else: print("") amount = int(input("Enter the amount of EC2 instances: ")) for instance in range(0, amount): randomnum = random.randint(100, 999) randomchar = ''.join(random.choices(string.ascii_letters, k=5)) ec2name = "{}_{}{}{}".format(department, randomnum, randomchar, instance) ec2list.append(ec2name) # 打印逻辑移至循环外,所有名称生成完成后一次性输出 print("\n".join(ec2list))
效果验证
输入5个EC2实例时,会精准输出5行唯一名称,无重复打印问题,示例输出:
finops_887zCseK0 finops_933rUCpF1 finops_310vbvWB2 finops_288eQKTY3 finops_924qOqWj4
补充:当前名称生成逻辑已经追加了循环索引
instance作为后缀,即使随机数、随机字符出现碰撞,最终生成的名称也不会重复,不需要额外添加去重逻辑。
内容的提问来源于stack exchange,提问作者bossu
相关产品推荐
相关产品推荐

