我想重新排序列表中的数字成员(列表仅包含数字),如果字符串形式为num1 +字符串形式的num2> =字符串形式的num2 +字符串形式的num1,则num1应该超前num2(我无法直接比较数字,因为数字可能非常大,或者数字的连接字符串格式可能非常大并且溢出)。这是一个例子,
num1 = 3
num2 = 30
因为num1 + num2> num2 + num1#'330'> '303'
所以,3应该超过30
另一个例子,输入是[3,30,34,5,9],预期输出是[9,5,34,3,30],并想知道如何优雅地编写Python代码?我们可以为Python列表编写一个自定义的cmp方法吗?
看来这种方法不起作用?排序后的步骤,l仍然与原始值相同?
def cmp_values(v1, v2):
_v1 = int('{0}{1}'.format(v1, v2))
_v2 = int('{0}{1}'.format(v2, v1))
return cmp(_v2, _v1)
if __name__ == "__main__":
l = [3, 30, 34, 5, 9]
sorted(l, cmp=cmp_values)
print l
提前谢谢,
林
答案 0 :(得分:2)
您可以使用自定义cmp方法对列表进行排序:
def cmp_values(v1, v2):
_v1 = int('{0}{1}'.format(v1, v2))
_v2 = int('{0}{1}'.format(v2, v1))
return cmp(_v2, _v1)
然后用它来对列表进行排序
In [5]: l = [3, 30, 34, 5, 9]
In [6]: sorted(l, cmp=cmp_values)
Out[6]: [9, 5, 34, 3, 30]
你确实需要处理溢出问题。如果v1和v2的组合超过int范围。
根据@LinMa的进一步评论
使用sorted
不会更改原始列表,因此您需要将返回的列表分配给新变量:
new_list = sorted(l, cmp=cmp_values)
答案 1 :(得分:1)
你的问题很模糊......
下次,请务必使用适当的缩进格式正确设置代码格式(点击“撤消”箭头下方的if(!isset($_SESSION['not_unique'])) {
$_SESSION['not_unique'] = 1;
$old_views = get_post_meta( $post_id, $meta_key, true );
$new_views = absint( $old_views ) + 1;
update_post_meta( $post_id, $meta_key, $new_views, $old_views );
}
即可找到。
在整理列表时,只需使用Code
函数,如下所示:
.sort()
这应该返回:
new_list = [3,6,1,2,4,5]
new_list.sort()
print(new_list)
这是如何对其进行排序的最简单的解释。希望这有点帮助。
答案 2 :(得分:1)
与AKS相同的想法。更长的代码,但可能很容易遵循步骤。
list = [3, 30, 34, 5, 9, 8]
job_done = False
while(job_done == False):
job_done = True
for i in range(len(list) - 1):
as_is = int('{0}{1}'.format(list[i], list[i + 1]))
swaped = int('{0}{1}'.format(list[i + 1], list[i]))
if as_is < swaped:
tmp = list[i]
list[i] = list[i + 1]
list[i + 1] = tmp
job_done = False
print list