假设我有一组唯一的数字[5,123,49176,30982,542]现在我想转换数字并得到另一组唯一数字(整数),它们将在0到25之间< / p>
任何人都可以建议任何可以帮我解决这个问题的算法吗?
答案 0 :(得分:3)
你要将它们标准化吗?
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]
如果结果的元素限制为整数:
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]
这对你来说是两种妥协方式。但根据你的评论,你实际上需要一个内射函数,其域都是整数,而codomain是[0,25] 中的整数。不幸的是,这是一项不可能的任务。
答案 1 :(得分:2)
(假设整数)
您可以对元素进行排序,并为每个元素指定其索引(在排序列表中)。假设你有少于(或确切)26个数字,你将获得所需的范围。如果您可以通过将数字设置为集合的当前顺序(例如,迭代顺序)来为同一组设置不确定性结果,则还可以避免排序。
请注意,如果您想要一些常规案例哈希,则无法完成 - 如果您的范围大于26 - 您将有重复项。这直接来自Pigeonhole principle,其范围是鸽子,范围[0,25]是鸽笼。
答案 2 :(得分:0)
将每个数字用作随机函数的种子,然后检查并确保没有任何重复。
如果你有一个大于25的集合,这也将被打破,就像阿米特说的那样。