使用python为ID列表指定一个唯一的4位数字

使用python为ID列表指定一个唯一的4位数字,python,Python,我有一个ID列表,我想给每个ID一个4位数的唯一编号 例如: driver id = ['5c73d1238472750067e86c6d','5a0d5513494c09001491c118'] unique id = ['1234' , '5897'] 有我可以使用的包吗?您可以像这样使用string对象的zfill函数 ids = [1, 2, 3, 4] list(map(lambda x: str(x).zfill(4), ids)) 并将导致: ['0001', '0002',

我有一个ID列表,我想给每个ID一个4位数的唯一编号

例如:

driver id = ['5c73d1238472750067e86c6d','5a0d5513494c09001491c118']
unique id = ['1234' , '5897']

有我可以使用的包吗?

您可以像这样使用string对象的zfill函数

ids = [1, 2, 3, 4]
list(map(lambda x: str(x).zfill(4), ids))
并将导致:

['0001', '0002', '0003', '0004']
输出:

['7518', '7806', '4654', '0677']

假设4位数字用作
字符串
,大多数答案都是关于如何生成它们的。 让我们来研究这个问题,提出设计、约束和管理它们

如果您使用数字作为数字,而不是字符串,则以非零开头的非零数字是, 1000到9999,您只能处理8999个元素(您的案例中的驱动程序)-约束

例子:如果你认为0123是一个数字,实际上是3位数,123。< /P> 设计:

使用
范围(100010000)
在for循环中生成数字,并将其保存在列表中(代码如下): 复杂性:是常数O(c),只发生一次

>>>
>>> four_digit_pool = []
>>> for i in range(1000, 10000):
...     four_digit_pool.append(i)
...
>>>
当您遇到一个元素时,查找该键是否存在,并将其添加到驱动程序id映射中

将其添加到列表(ID池)中的map和pop元素中。不要使用移除,使用pop,pop始终为O(1)。 注意:在本例中,remove也是O(1),因为它是排序的,并且您正在从左侧逐个移除。但是用流行音乐来保证

driver_id_map = {
1000 : '5c73d1238472750067e86c6d'
1001 : '5a0d5513494c09001491c118'
...
}
若要查找驱动程序是否已在列表中,也可以将上面的映射反转

driver_id_map = {
'5c73d1238472750067e86c6d' : 1000
'5a0d5513494c09001491c118' : 1001
...
}
地图的查找是O(1)

如果循环遍历所有驱动程序并分配它,则复杂性为O(N)

注意: 如果您使用数字作为字符串,并且考虑以零开始的非零数字,则为1108个数字。您将获得额外的~1000个可解决的驱动程序

这些数字也会进入四位数池。复杂性不会有太大变化

以0-999开头的数字,例如:0123

以00-99开头的数字,例如:0023

以000-9开头的数字,例如:0003


以0000-1开头的数字,例如:0000(唯一的一个)

如果它是一个列表,您可以只给出与列表索引对应的id(在需要时用“000”作为前缀)。例如,
unique\u id=['0000',0001']
在您的示例中。您可以检查驱动程序id在列表中是否出现两次或两次以上,它是否需要具有相同的唯一id?驱动程序id是唯一的,它永远不会出现duplicated@K.Amr
random.sample
通常用于从池中检索非重复元素。您也可以
随机。洗牌
id池并不断从中弹出。是否有可能输出包含重复值?虽然这不太可能,但您仍有千分之一的机会获得与现有id相同的数字。是否有办法确保不会重复?数学时间!90%保证您至少有一个重复的数字需要多少个数字?复杂性为O(N^2),因为每个数字遍历
列表
驱动程序id
driver_id_map = {
1000 : '5c73d1238472750067e86c6d'
1001 : '5a0d5513494c09001491c118'
...
}
driver_id_map = {
'5c73d1238472750067e86c6d' : 1000
'5a0d5513494c09001491c118' : 1001
...
}