我已经找到了一个答案,似乎无法在SO上找到答案(随意证明我的错误),但是这里有。
我有一个不可思议的大型列表(数百万的数值),其中所有数字都在100到1500之间。
如果我们将此列表称为A,那么基本上我就是这样做的:
A= [impossibly large list]
A.sort()
然后发表一项声明,以便了解所有事情的顺序。我期待的顺序是:
A = [151.14, 300, 1501.3]
但我得到的是:
A = [1501.3, 151.14, 300]
它似乎是按第一个数字排序,然后是下一个等等。
任何人都知道这是否是下面的算法固有的,或者这是因为我的列表的大小?
答案 0 :(得分:5)
您会看到,如果您实际上正在排序字符串,而不是数字。字符串排序为lexicographically,其中'1'
在'20'
之前,'A'
就像'Bee'
之前的>>> A = ['151.14', '300', '1501.3']
>>> A.sort()
>>> A
['1501.3', '151.14', '300']
一样:
A
转换您的'数字'通过替换float
中的所有值或使用>>> A.sort(key=float)
>>> A
['151.14', '300', '1501.3']
作为排序键来实际浮点值:
function addForm(btn, prefix) {
var formCount = parseInt($('#id_' + prefix + '-TOTAL_FORMS').val());
// Clone a form (without event handlers) from the first form
var row = $(".item-wrapper:first").clone(false).get(0);
// Makes a naked copy of them
$(row).children().find(":input").val('');
// Inserts into discount and quantity default values
// Searches for id that contains discount
$(row).children().find('[id*=discount]').val('0');
$(row).children().find('[id*=quantity]').val('1.0');
// Insert it after the last form
$(row).removeAttr('id').hide().insertAfter(".item-wrapper:last").slideDown(300);
// Remove the bits we don't want in the new row/form
// e.g. error messages
$(".action-warning", row).remove();
$(row).children().removeClass("error");
// Relabel or rename all the relevant bits (???????)
$(row).children().children().children().each(function () {
updateElementIndex(this, prefix, formCount);
$(this).val("");
});
// Add an event handler for the delete item/form link
$(row).find("#delete").click(function () {
return deleteForm(this, prefix);
});
// Update the total form count
$("#id_" + prefix + "-TOTAL_FORMS").val(formCount + 1);
return false;
}
当然,你可能想问问自己,你是否真的需要你的巨大名单,首先要排序。也许其他结构(树木,堆等)会更好地为你的目标服务?