我有一个csv加载到行中作为更大列表中的列表 - 大约500,000个。行/子列表中的一个项目是分数。这个得分是一个从0到1不等的浮点数。这些得分恰好分散在一个非常不平衡的方式,我想要将它们的分布正常化。我不需要像钟形曲线那样棘手的任何事情,只需要从1到0的等级进行均匀的步骤,并且以任何方式分层的分数(大数不重要)。我也喜欢按分数降序排序的结果。
示例列表作为起点:
list1 = [
['item1', 0.955, 'asdcwe', 'adcwett'],
['item2', 0.111, 'awioe', 'ocijwe'],
['item3', 0.111, 'dcuwq0eu', 'a9dfuwe'],
['item4', 0.5, 'aosdic', '204523'],
['item5', 1.0, 'oooo', 'ffff'],
['item6', 0.112, '03423', 'aewcew']]
示例结果:
sortedlist = [
['item5', 1.0, 'oooo', 'ffff'],
['item1', 0.8, 'asdcwe', 'adcwett'],
['item4', 0.6, 'aosdic', '204523'],
['item6', 0.4, '03423', 'aewcew'],
['item2', 0.2, 'awioe', 'ocijwe'],
['item3', 0.0, 'dcuwq0eu', 'a9dfuwe']]
(对我来说不重要的细节:最小/最大可能是包容性的或排他性的,因此在这种情况下得分可能会产生0.143-0.857。另外,如果第2项和第3项,并列,最终在结果中翻了一遍,也没问题。)
答案 0 :(得分:1)
最简单的方法是排序,然后标准化:
step = 1.0 / (len(list1) - 1)
sortedlist = [l[:1] + [(len(list1) - i - 1) * step] + l[2:]
for i, l in enumerate(sorted(list1, key=lambda item: item[1], reverse=True))]
演示:
>>> list1 = [
... ['item1', 0.955, 'asdcwe', 'adcwett'],
... ['item2', 0.111, 'awioe', 'ocijwe'],
... ['item3', 0.111, 'dcuwq0eu', 'a9dfuwe'],
... ['item4', 0.5, 'aosdic', '204523'],
... ['item5', 1.0, 'oooo', 'ffff'],
... ['item6', 0.112, '03423', 'aewcew']]
>>> step = 1.0 / (len(list1) - 1)
>>> sortedlist = [l[:1] + [(len(list1) - i - 1) * step] + l[2:]
... for i, l in enumerate(sorted(list1, key=lambda item: item[1], reverse=True))]
>>> pprint(sortedlist)
[['item5', 1.0, 'oooo', 'ffff'],
['item1', 0.8, 'asdcwe', 'adcwett'],
['item4', 0.6000000000000001, 'aosdic', '204523'],
['item6', 0.4, '03423', 'aewcew'],
['item2', 0.2, 'awioe', 'ocijwe'],
['item3', 0.0, 'dcuwq0eu', 'a9dfuwe']]