创建唯一的字典键

Posted

技术标签:

【中文标题】创建唯一的字典键【英文标题】:Creating a unique dictionary key 【发布时间】:2019-02-08 05:23:18 【问题描述】:

问题

我正在 Django 中进行电子商务,用户可以在将它们添加到购物车之前选择多个项目,当单击“添加到购物车”按钮时,我使用时间戳作为用户购物车中的对象 ID。

当点击添加到购物车按钮时,我有一个字典

"item_id":"qty"

创建购物车对象的过程如下

"timestamp":"item_id;qty"

时间戳用作唯一 id,因此如果需要删除购物车的行,我可以为它们提供 id,如果需要,则在后端发送购物车元素的 id 并从中删除相同的元素用户的购物车对象

时间戳不是唯一的...该过程太快以至于时间戳保持不变并且不会产生不同的键任何建议具有不同的时间戳将不胜感激。

【问题讨论】:

我很困惑 - 你想解决什么问题? 必须您使用时间戳吗?您能否将同时创建的值存储在所述时间戳下的列表中?这可能是the XY problem 的一个例子。 你为什么要四舍五入? 为什么,是的,正如您所说,时间戳不是唯一的。因此,您必须为发生碰撞做好准备。也许让每个值成为可能值的列表 因为您还没有为这些时间戳的用途添加上下文,而且我们怀疑我们在 XY problem 上浪费了时间。 ????‍♂️ Sooo……你只需要一个唯一的 id ‽ 你似乎根本不喜欢使用时间戳‽ 那为什么不使用合适的东西,比如 UUID ,或者只是一个list,它会有唯一的索引? 【参考方案1】:

时间戳用作唯一 ID,因此如果需要删除购物车的行,我可以为它们提供 ID

你找错人了,试图在不适合原始问题的解决方案中解决问题;即你有一个XY problem。

最简单的解决方案:使用list 而不是dictlist 根据定义将具有唯一键。 list 的唯一问题是,在 Web 场景中,您可能正在处理两个并行或过时的请求,并且索引在到达您的服务器时可能会引用不同的元素。

所以要使用真正唯一、不变的 ID,请使用 uuid module:

from uuid import uuid4

a = [1 ,2 ,3 , 4 , 5]
b = 
for i in a:
    b[uuid4()] = i

你去吧,保证唯一的 ID。

【讨论】:

【参考方案2】:

如果您希望您的密钥是唯一的并且在某种程度上是基于时间的,只需手动递增它们:

import time
key = time.time() * 1000
a = [1 ,2 ,3 , 4 , 5]
b = 
for i in a:
    b[key] = i
    key += 1

print(b)

【讨论】:

【参考方案3】:

如何使用datetime 模块

from datetime import datetime

for i in a:
    b[datetime.now()] = i

编辑:

也许更好的让它独一无二的方法是在时间戳中添加一个独特的元素。一种方法是将 UUID 添加到混合中。

import uuid

for i in a:
    b[timestamp() + uuid.uuid4()] = i

但我可能有点夸张了。只是一个建议。

【讨论】:

好吧,这是一个可行的解决方案,为什么要投反对票?这不是题外话,它有效,我不会使用它,但它可以帮助 SO 中的某人 我明白为什么我被否决了。它仍然没有解决使其独一无二的问题。

以上是关于创建唯一的字典键的主要内容,如果未能解决你的问题,请参考以下文章

如何创建键字典:column_name 和 value:来自数据框的 python 中的列中的唯一值

Python从菜鸟到高手(16):创建和使用字典

字典操作

字典的创建和使用

如何动态创建字典和添加键值对?

C#创建安全的字典(Dictionary)存储结构