Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 动态生成具有唯一名称的词典条目_Python_Python 3.x - Fatal编程技术网

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

Python 动态生成具有唯一名称的词典条目,python,python-3.x,Python,Python 3.x,我正在尝试动态生成单元格。每个单元格都有一个名称,定义为字典的键。该值是一个类的实例,包含三个参数(强度、智能、能量) 随机导入 类别单元格: 定义初始(自我、能量、力量、智力): 自我能量=能量 自我力量=力量 自我智力 单元格={} k=1 当k

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

随机导入
类别单元格:
定义初始(自我、能量、力量、智力):
自我能量=能量
自我力量=力量
自我智力
单元格={}
k=1
当k<100时:
key=“a”+str(k)
打印(“生成单元格:+键)
cells[key]=Cell(random.randint(1100)、random.randint(1100)、random.randint(1100))
k+=1#生成单元
我的问题是名字。这段代码对于第一代单元格来说已经足够好了,但是当我需要制作更多的单元格时,由于名称冲突,新的单元格可以覆盖旧的单元格

是否有方法生成随机但唯一的单元格名称以避免此类冲突?我试着创建一个以“a”开头的新名字,这个名字的最低数字还不存在。然而,在我的整个程序中,细胞都会死亡。我的方法只是填补这些空白,这将很难确定单元格来自哪一代。

您可以使用python的库

简单示例(脱离上下文):

将uuid导入为uuidlib
uuid=str(uuidlib.uuid4())

就你而言:

导入uuid
随机输入
类别单元格:
定义初始(自我、能量、力量、智力):
自我能量=能量
自我力量=力量
自我智力
单元格={}
k=1
当k<100时:
key=str(uuid.uuid4())
打印(“生成单元格:+键)
cells[key]=Cell(random.randint(1100)、random.randint(1100)、random.randint(1100))
k+=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'
此外,除了能量、强度和智能之外,您还可以在单元格类中添加
版本
/
生成
字段。可以添加计数器以获取当前版本,并在每次更新单元格时增加版本

根据您的需求,您可以使用它删除旧单元格,或将其作为版本历史记录保存。 要删除旧单元格,只需使用
random\u 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

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

查看uuid库。如果密钥是现有密钥,您可以在每次迭代中进行检查。我认为他还希望能够跟踪每个密钥的生成。我可能错了,因为我根本不明白他想要什么。
some_dict[random_str][-1] # to access the last element of list