我正在尝试动态生成单元格。每个单元格都有一个名称,该名称定义为字典的键。该值是一个类的实例,包含三个参数(强度,智能,能量)。
import random
class Cell:
def __init__(self, energy, strength, intelligence):
self.energy = energy
self.strength = strength
self.intelligence = intelligence
cells = {}
k = 1
while k < 100:
key = "a" + str(k)
print("Generating cell: " + key)
cells[key] = Cell(random.randint(1, 100),random.randint(1, 100),random.randint(1, 100))
k += 1 #Generate cells
我的问题是名字。该代码对于第一代单元格已经足够好了,但是当我需要做更多时,由于名称冲突,新单元格可以覆盖旧单元格。
是否有一种方法可以生成随机但唯一的单元名称来避免这种冲突?我尝试创建以'a'开头的新名称,该名称不存在。但是,在整个程序中,细胞都会死亡。我的方法只是填补了空白,这使得很难确定该细胞来自哪个世代。
答案 0 :(得分:2)
您可以使用python的uuid
库。
简单示例(无上下文):
import uuid as uuidlib
uuid = str(uuidlib.uuid4())
在您的情况下:
import uuid
import random
class Cell:
def __init__(self, energy, strength, intelligence):
self.energy = energy
self.strength = strength
self.intelligence = intelligence
cells = {}
k = 1
while k < 100:
key = str(uuid.uuid4())
print("Generating cell: " + key)
cells[key] = Cell(random.randint(1, 100),random.randint(1, 100),random.randint(1, 100))
k += 1 #Generate cells
答案 1 :(得分:1)
您可以尝试使用此函数生成随机名称
import random
def random_string(min_size, max_size):
import string
return ''.join(random.choices(string.ascii_uppercase + string.ascii_lowercase + string.digits, k=random.randint(min_size, max_size)))
random_string(7, 15)
这给出了类似的输出
'AvkyCzlN9ggPr'
,如果再次运行,它可能会给'FBPXy5a4Ib'
此外,除了精力,力量和智慧,您还可以向您的细胞类别添加version
/ generation
字段。您可以添加一个计数器来获取当前版本,并在每次更新单元格时增加版本。
根据您的要求,然后可以使用它删除旧单元格,或将它们保留为版本历史记录。
要删除旧单元格,只需使用random_string()
例如:-
some_dict = {}
randomstr = random_string(7, 15)
some_dict[random_str] = some_cell(randomstr)
要覆盖
some_updated_cell = some_cell.update() # decide to increment your version? upto you.
# If you keep the randomstr same it will override the dict key, else it will not override and you can make (randomstr +"-"+ str(version)) as the key of dict.
some_dict[some_updated_cell.get_randomstr] = some_updated_cell
不覆盖并跟踪生成情况
version = 1 # build a method or autoincrement version.
key = randomstr + "-" + str(version)
然后您可以执行key.split("-")
来从'AvkyCzlN9ggPr-1'
获取密钥和版本。
另一种替代方法是将字典值用作对象列表。因此,您可以将其附加到列表中,而不是替换字典值。
some_dict[randomstr] = []
some_dict[randomstr] = [*some_dict[randomstr], newObject]
要访问最新一代的内容,只需
some_dict[random_str][-1] # to access the last element of list
如果这不能解决您的问题,请发表评论,我会进行相应的更新:)