Sorting 将所有值减少到一个指定值
因此,我有一组列表,如下所示:Sorting 将所有值减少到一个指定值,sorting,python-3.x,Sorting,Python 3.x,因此,我有一组列表,如下所示: [['Amy,1,"10,10,6"'], ['Bella,3,"4,7,2"'], ['Cendrick,3,"5,1,9"'], ['Fella,2,"3,8,4"'], ['Hussain,1,"9,4,3"'], ['Jamie,2,"1,1,1"'], ['Jack,3,"10,8,0"'], ['Thomas,2,"5,0,5"'], ['Zyra,1,"7,8,7"']] 姓名后的数字是学生的班号,下面的3个数字是该学生的3分 我已将其从一组有组织
[['Amy,1,"10,10,6"'], ['Bella,3,"4,7,2"'], ['Cendrick,3,"5,1,9"'], ['Fella,2,"3,8,4"'], ['Hussain,1,"9,4,3"'], ['Jamie,2,"1,1,1"'], ['Jack,3,"10,8,0"'], ['Thomas,2,"5,0,5"'], ['Zyra,1,"7,8,7"']]
姓名后的数字是学生的班号,下面的3个数字是该学生的3分
我已将其从一组有组织的列表中按字母顺序排序,但我在以下方面遇到困难:
我希望能够按字母顺序对它们进行排序,但只针对特定的类和最后三个值中的最高分数。例如,如果我想对类2进行排序,那么输出如下:
Fella,8
Jamie,1
Thomas,5
import operator
classNum = 1 # let's say you want all the students from class number 1
answer = sorted([s for s in students if s[1]==classNum], key=operator.itemgetter(0))
for student in answer:
name = student[0]
grade = max(student[2:]))
print(name, grade)
因为名字是按字母顺序排列的,所有的学生都来自2班。每个学生的高分也被放在他们旁边
我真的很感激任何帮助。TIA也许这会奏效:
def transform(inputs, class_number):
results = []
for input in inputs:
input = input[0]
input_pieces = input.split(',', 2)
if input_pieces[1] != class_number:
continue
scores = input_pieces[2].strip('"').split(',')
results.append((input_pieces[0], max(scores)))
return results
另外,我强烈建议您使用一些东西来赋予数据更多的结构,而不仅仅是逗号分隔的字符串。差不多。然后,您就可以拥有一个带有有意义的命名字段的命名元组列表。您的数据结构太不合理了。看起来您想在列表中保存每个学生的信息,但最后只在列表中放置了一个逗号分隔的字符串,其中包含该信息。然后,您得到一个列表列表,每个列表都包含一个这样的字符串 这就是你真正想要做的:
[[Amy, 1, 10,10,6],
[Bella, 3, 4,7,2],
[Cendrick, 3, 5,1,9],
[Fella, 2, 3,8,4],
[Hussain, 1, 9,4,3],
[Jamie, 2, 1,1,1],
[Jack, 3, 10,8,0],
[Thomas, 2, 5,0,5],
[Zyra, 1, 7,8,7]
]
以下是你如何将你所拥有的转化为你想要的:
students = []
for student in myList: # myList is the list that you already have
s = []
name, course, grades = student[0].split(',', 2)
s.append(name)
s.append(int(course))
s.extend([int(i) for i in grades.strip('"').split(',')])
students.append(s)
一旦你有了这个,你就可以按如下方式过滤和排序学生
:
Fella,8
Jamie,1
Thomas,5
import operator
classNum = 1 # let's say you want all the students from class number 1
answer = sorted([s for s in students if s[1]==classNum], key=operator.itemgetter(0))
for student in answer:
name = student[0]
grade = max(student[2:]))
print(name, grade)
请注意,我说过这似乎是你想要做的。在你的位置上,我会这样做:
from collections import namedtuple as ntuple
Student = ntuple('Student', ['name', 'course', 'grades'])
students = []
courseNum = 1
for student in myList: # myList is the list that you already have
s = Student
name, course, grades = student[0].split(',', 2)
course = int(course)
if course != courseNum: continue
grades = [int(i) for i in grades.strip('"').split(',')]
students.append(Student(name, course, grades))
students.sort(key=operator.attrgetter('name'))
for student in students:
print(student.name, max(student.grades))
下面是解决方案,您目前存储数据的方式使处理变得困难
>>> lst = [['Amy,1,"10,10,6"'], ['Bella,3,"4,7,2"'], ['Cendrick,3,"5,1,9"'],
['Fella,2,"3,8,4"'], ['Hussain,1,"9,4,3"'], ['Jamie,2,"1,1,1"'], ['Jack,3,"10,8,0"'], ['Thomas,2,"5,0,5"'], ['Zyra,1,"7,8,7"']]
>>> from itertools import chain
>>> lst_flat = chain.from_iterable(lst)
>>> sorted_lst = sorted(filter(lambda x: x.split(',')[1] == '2', lst_flat))
>>> print map(lambda x: (x.split(',')[0],
max([int(y) for y in x.split('"')[1].split(',')])), sorted_lst)
[('Fella', 8), ('Jamie', 1), ('Thomas', 5)]
你应该考虑清理你所代表的数据的方式:
>>> from pprint import pprint
>>> from itertools import chain
>>> lst_clean = []
>>> for item in chain.from_iterable(lst):
... name, cls = item.split(',')[0], item.split(',')[1]
... marks = [int(x) for x in item.split('"')[1].split(',')]
... lst_clean.append((name, cls, marks))
>>> pprint(lst_clean)
[('Amy', '1', [10, 10, 6]),
('Bella', '3', [4, 7, 2]),
('Cendrick', '3', [5, 1, 9]),
('Fella', '2', [3, 8, 4]),
('Hussain', '1', [9, 4, 3]),
('Jamie', '2', [1, 1, 1]),
('Jack', '3', [10, 8, 0]),
('Thomas', '2', [5, 0, 5]),
('Zyra', '1', [7, 8, 7])]
>>> sorted_lst = sorted([(name, cls, marks) for (name, cls, marks) in lst_clean if cls == '2'])
>>> for name, cls, marks in sorted_lst:
... print name, max(marks)
Fella 8
Jamie 1
Thomas 5
我没有注意到每个元素都是一个字符串。我编辑了我的解决方案。你所说的转换函数中的“输入”是什么意思?调用函数时,我是否应该将列表的名称放在这里?是的,你传入列表。我一直在函数的返回点处遇到语法错误。我也遇到了同样的错误。它说有太多的值需要解包,因为它希望在名称、课程、成绩=学生[0]处有3个值…@Hussain:很抱歉。我错过了一个微妙的错误在那里。现在就试试谢谢兄弟,它现在似乎很好用,我真的很感激你的帮助help@Hussain:请标记一个已接受的答案,以便其他用户知道您的问题已得到回答ValueError:需要超过1个值才能解包,我再次遇到相同的错误,错误发生在相同的位置-姓名、课程、成绩=学生[0]。。。很抱歉打扰您,但是您能解决这个问题并向我解释当我得到这个“值解包”错误时它意味着什么吗。蒂亚。