动态生成具有唯一名称的字典条目

时间:2018-09-30 16:25:30

标签: python python-3.x

我正在尝试动态生成单元格。每个单元格都有一个名称,该名称定义为字典的键。该值是一个类的实例,包含三个参数(强度,智能,能量)。

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'开头的新名称,该名称不存在。但是,在整个程序中,细胞都会死亡。我的方法只是填补了空白,这使得很难确定该细胞来自哪个世代。

2 个答案:

答案 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

如果这不能解决您的问题,请发表评论,我会进行相应的更新:)