Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 将所有值减少到一个指定值_Sorting_Python 3.x - Fatal编程技术网

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]。。。很抱歉打扰您,但是您能解决这个问题并向我解释当我得到这个“值解包”错误时它意味着什么吗。蒂亚。