我有一个清单
numbers = [869, 1069, 1108, 1343, 389]
我想按数字总和的升序(例如869的8 + 6 + 9)
def s_num(nums):
result = [sum(int(digit) for digit in str(number)) for number in numbers]
return result
s_num = sorted(numbers,key=s_num)
print(s_num)
但是,由于某种原因,我的输出与初始列表相同
print(s_num)
[869, 1069, 1108, 1343, 389]
如何更改脚本以获取正确的排序列表?
答案 0 :(得分:3)
您可以将字符串转换后的数字的数字字符映射为整数,以便将它们传递给sum
函数:
def s_num(n):
return sum(map(int, str(n)))
进行此更改后,sorted(numbers, key=s_num)
将返回:
[1108, 1343, 1069, 389, 869]
答案 1 :(得分:3)
键函数应带有一个参数,并返回一个用于排序目的的值。您不应迭代该函数中的numbers
数组。这样做:
numbers = [869, 1069, 1108, 1343, 389]
def s_num(num):
return sum(map(int, str(num)))
result = sorted(numbers,key=s_num)
print(result)
输出
[1108, 1343, 1069, 389, 869]
答案 2 :(得分:1)
我认为您错过了正确使用public void bil()
{
SqlConnection con = new SqlConnection();
con.ConnectionString = (@"Server=DESKTOP-8JJO9NL\SQLEXPRESS;Database=HMS;Trusted_Connection=True");
con.Open();
string sqlquery = "select DATEDIFF(day,arrivaldate,departure) AS TotalDays=@tdays ,(DATEDIFF(day,arrivaldate,departure) * 10) AS CalculatedAmount=@amount from Roomsdata where room#=@roomnum2";
SqlCommand command = new SqlCommand(sqlquery, con);
SqlDataReader sReader;
command.Parameters.Clear();
command.Parameters.AddWithValue("@roomnum2", Roomnum);
sReader = command.ExecuteReader();
while (sReader.Read())
{
Tdays = sReader["TotalDays"].ToString();
Amount = sReader["CalculatedAmount"].ToString();
}
con.Close();
函数参数的机会。此外,已排序的函数已经在s_num(nums)
列表的各个元素上循环,因此在numbers
函数中不需要嵌套循环。
s_num(nums)
答案 3 :(得分:1)
您可以使用key
参数在一行中完成
sorted(numbers,key=lambda x:(sum(map(int,str(x)))))
输出
[1108, 1343, 1069, 389, 869]
答案 4 :(得分:1)
您的s_sum(nums)函数将忽略其接收的参数(nums),并为numbers变量的所有项计算位数之和。这将始终是相同的结果,因此您的列表未排序。
您可以将其更改为:ncdu
或使用此处发布的建议答案之一。