按列表中项目的总和对数字列表进行排序

时间:2018-11-26 10:49:45

标签: python python-3.x

我一直在尝试解决一个要求返回标题问题的函数的问题。输出的一个示例为以下示例:

sum_of_digits_sorted([56, 2131])

返回

[2131, 56]

由于2+1+3+1 <比5+6小,因此新列表将按照示例中的顺序进行排序。

我使用了在列表上进行迭代的代码,并且还编码了一种对数字求和的方式,但是我不知道如何将它们一起应用

PD:我是这个网站的新手,所以我不知道如何附加程序和这些东西。谢谢!

3 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

In [553]: l
Out[553]: [56, 2131]

In [554]: new = []  # define an empty list

In [555]: for c,i in enumerate(l):
     ...:     if c < len(l)-1:
     ...:         lst = map(int, str(l[c])) # converts individual element into a list
     ...:         lst1 = map(int, str(l[c+1]))
     ...:         if sum(lst) > sum(lst1): # sum(lst) gives the sum of the list
     ...:             new.append(l[c+1])
     ...:             new.append(l[c])
     ...:         else:
     ...:             new.append(l[c])
     ...:             new.append(l[c+1])
     ...:         
     ...:     

In [556]: new  # will be a sorted list based on the sum of digits of individual elements.
Out[556]: [2131, 56]

答案 1 :(得分:0)

这仅是为了演示该想法,它将为每次比较计算总和,这对于较大的列表而言不是十分有效:

def sum_of_digits_sorted(a):
  return sorted(a,key=lambda x: sum([int(i) for i in str(x)]))

>>> sum_of_digits_sorted([1, 2131, 56, 99])
[1, 2131, 56, 99]

这与带有预先计算的键的临时元组的想法相同:

list(map(lambda y:y[1],sorted([(sum([int(i) for i in str(x)]),x) for x in a],key=lambda x: x[0])))

有几种计算小数点总和的方法的比较,当我将上述方法与Sum the digits of a number - python中最快的方法进行比较时,该方法要慢30%左右,除非您计算出一个大量的款项。即使该答案的速度慢了3倍。对于一次性脚本,可能会做任何事情。对于速度更关键的事情,我会选择最快的速度-可能会在可比较的硬件和python版本上进行测试。

答案 2 :(得分:0)

您可以使用算法通过:close和生成器表达式来计算整数的数字根。然后将其用作排序键:

sum