假设我有一组唯一数字 [5, 123, 49176, 30982, 542] 现在我想转换数字并获得另一组唯一数字(整数),范围在 0 到 25 之间
任何人都可以建议任何可以帮助我解决这个问题的算法吗?
你要把它们标准化吗?
raw = [5, 123, 49176, 30982, 542]
normalization = [(i-min(raw))/(max(raw)-min(raw))*25 for i in raw]
print(normalization)
它会给你:(所有元素都保证是唯一的)
[0.0, 0.059994712330438675, 25.0, 15.749628846271177, 0.2730267840800472]
如果 result 的元素被限制为整数:
import random
raw = [5, 1, 23, 49176, 30982, 542]
if len(raw) > 26: #there's no way to get more than 26 unique elements from 0~25 integers
print("mission impossible")
else:
print(random.sample(range(26), len(raw)))
它会给你(例如):
[23, 4, 13, 10, 18, 24]
这对你来说是两种妥协的方式。但是根据您的评论,您实际上需要一个单射函数,其域都是整数,而余域是 [0,25] 中的整数。不幸的是,这是一项不可能完成的任务。
(假设整数)
您可以对元素进行排序,并为每个元素指定其索引(在排序列表中)。假设您的数字少于(或正好)26 个,您将获得所需的范围。如果您可以通过仅将数字设置为集合的当前顺序(例如迭代顺序)来允许同一集合的不确定结果,您也可以避免排序。
请注意,如果您想要一些一般大小写哈希,则无法完成 - 如果您的范围大于 26 - 您将有重复。这直接来自鸽笼原理,其中范围是鸽子,范围 [0,25] 是鸽笼。
将每个数字用作随机函数的种子,然后检查并确保没有任何重复项。
如果你有一个大于 25 的集合,这也会崩溃,就像 Amit 说的那样。