打包多个python元组并进行排序
问题:您需要编写一个程序,按升序对(名称、年龄、高度)元组进行排序,其中名称是字符串,年龄和高度是数字。元组由控制台输入。排序标准为: 1:按名称排序; 2:然后根据年龄进行排序; 3:然后按分数排序。优先顺序是姓名>年龄>分数。如果以下元组作为程序的输入:打包多个python元组并进行排序,python,sorting,tuples,Python,Sorting,Tuples,问题:您需要编写一个程序,按升序对(名称、年龄、高度)元组进行排序,其中名称是字符串,年龄和高度是数字。元组由控制台输入。排序标准为: 1:按名称排序; 2:然后根据年龄进行排序; 3:然后按分数排序。优先顺序是姓名>年龄>分数。如果以下元组作为程序的输入:Tom,19,80 John,20,90 Jony,17,91 Jony,17,93 Json,21,85,那么程序的输出应该是:[('John','20','90'),('Jony','17','91'),('Jony','17','93'
Tom,19,80 John,20,90 Jony,17,91 Jony,17,93 Json,21,85
,那么程序的输出应该是:[('John','20','90'),('Jony','17','91'),('Jony','17','93'),('Json','21','85'),('Tom 19','80')]
我的代码:
info = input()
info_list = [(name, age, height) for name, age, height in
case.split(',') for case in info.split(' ')]
sorted(info_list, key = lambda name:name[0])
我得到的错误是:ValueError:要解压缩的值太多(预期为3个)
有人能帮忙吗 使用
键
到排序
指定排序的基数
s = 'Tom,19,80 John,20,90 Jony,17,91 Jony,17,93 Json,21,85'
lst = [tuple(x.split(',')) for x in s.split()]
print(sorted(lst, key=lambda x: (x[0], x[1], x[2])))
# [('John', '20', '90'), ('Jony', '17', '91'), ('Jony', '17', '93'), ('Json', '21', '85'), ('Tom', '19', '80')] [Program finished]
其中,s
是您的输入字符串。解决方案是:
info = input()
info_list = [case.split(',') for case in info.split(' ')]
print(sorted(info_list))
示例输出:
Tom,19,80 John,20,90 Jony,17,91 Jony,17,93 Json,21,85
[['John', '20', '90'], ['Jony', '17', '91'], ['Jony', '17', '93'], ['Json', '21', '85'], ['Tom', '19', '80']]
解释代码不起作用的原因是:
- 使用多个迭代器,只对一个序列有效,而只有一个序列无效
- 为什么它不能与序列一起工作,它将尝试解压单个元素,即
,它无法解压,因为它不是包含3个元素的iterable,这是它工作的主要原因,即1
[1,2,3]
info_list=[(姓名、年龄、身高)代表姓名、年龄、身高在case.split(“”)中的case.split(“”)]
有什么问题吗?你的列表理解会抛出一个name错误
,因为当它试图拆分case
时,case
没有定义。按空格拆分应在按逗号拆分之前进行。保持正确的状态,这是行不通的,因为您在迭代中要解包到三个变量。对分割的迭代将对每个分割进行迭代。当我说每次拆分时,它意味着一次迭代中的'Tom'
,下一次迭代中的19
,依此类推。这并不是说你在一次迭代中得到了所有三个'Tom'
、19
和80
。因此出现了ValueError
。请注意,最初的问题是询问大列表中的元组,如果是这样,您的解释是否仍然适用于我犯的错误?谢谢另外,当你说多个迭代器时,你是指名称、年龄、高度中的[(姓名、年龄、高度)表示姓名、年龄、高度的case.split(“,”)表示信息中的case.split(“”)]
部分吗?@EdwardLin是的