我不是 Python 专家,但我正在考虑尝试简化事情。例如,我不认为使用字典是必要的,如果它只是一个你想经常做的简单功能。
我只会创建我需要的函数作为 lambda 函数。例如。
f = lambda: raw_input("INPUT NAME: ")
g = lambda: input("INPUT GRADE: ")
然后我会做这样的事情,定义一个函数,您可以在其中将学生人数作为一个值(“数字”)输入,这将产生可用作输出的东西。在这种情况下,我会生成一个嵌套列表。
seq = []
def names_grade(number):
seq = []
for i in range(number):
seq.append([g(),f()])
return seq
对我来说,现在输出的格式无关紧要。嵌套列表,即列表中的列表可能很有用。列表更适合某些事情。字典对于其他事情来说非常有用,但对于像这样的简单功能,我会尝试使用最简单的和最容易使用的排序等等。 Python 中还有其他数据类型,例如 Sets 或诸如此类。选择最适合当前问题的类型很重要。
所以我得到的是这个,运行后:
>>> x = names_grade(2)
INPUT GRADE: 30
INPUT NAME: Alex
INPUT GRADE: 40
INPUT NAME: Marc
>>> x
[[30, 'Alex'], [40, 'Marc']]
再说一次,我不是专家,但我做了这样的事情,定义一个函数给我最小的,在这种情况下只有 2 个输入,以后可以随时更改..
def smallest(x,y):
if x<y:
return x
else:
return y
然后我问并得到以下信息:
>>> smallest(x[0],x[1])
[30, 'Alex']
这不是一个完整的“解决方案”,它更多的是一种查看和分析问题以尝试找到最佳解决方案的方式。如果您愿意,我们会进行概念盘点,看看我们需要哪些功能以及什么值,什么类型的数据/值等。然后我们从那里构建。如果一开始就不能解决问题,那也没关系。我们开始逐步构建它,并在每个步骤中测试所有内容以确保它通过。
无论如何,我认为对于这类问题,更“功能范式”或“风格”可能会有用。只需定义您需要的函数,如 lambda 函数或诸如此类的“最小”函数,您需要的函数,然后您就可以使用诸如“map”之类的东西......
记住,地图的形式是:
r = map(func, seq)
它将函数(“func”)应用于序列(“seq”)的每个项目。因此,一旦你有了某种“names_grade”列表,你就可以使用 map 和你为手头的问题创建的任何函数。理想情况下,您只需几行代码即可完成所有操作。您也可以使用“功能组合”,通常您使用的是单行函数,我发现更具可读性。添加一个文档字符串或其他形式的文档,以适当的详细程度描述函数的作用、它需要什么输入(和输入类型)、它做什么以及它产生什么输出(和输出类型)。
最后,这几乎是我在 Stackoverflow 上回答的第一个问题,所以我希望我没有违反任何规则。请不要对我太苛刻,我只是来帮忙的,不要因为不知道如何写出正确的答案而受到人身攻击。祝大家有美好的一天。
*编辑:在过去的几个小时里,我一直在思考这个问题,我想我可能找到了解决方案。只需按等级对元组进行排序,如果两个等级相同,名称无论如何都会按字母顺序排列。例如。
>>> names_grades_tuple = [
('alex', 15),
('jane', 20),
('david', 19),
('john', 15),
]
>>> sorted(names_grades_tuple, key=lambda grade: grade[1])
[('alex', 15), ('john', 15), ('david', 19), ('jane', 20)]
我不明白为什么原始程序的结构是这样的。这对我来说似乎相当深奥,几乎深奥。在我上面给出的示例中,如果您想要第二个,则只需在排序后的第二个值处进行索引。例如。
>>> sorted_tuples = sorted(names_grades_tuple, key=lambda grade: grade[1])
>>> print sorted_tuples[1]
('john', 15)
这些有意义吗?我想也许我不太明白这个问题。对不起,如果我在这里浪费了任何人的时间。
**编辑 2:使用此参考(参考https://wiki.python.org/moin/HowTo/Sorting),我找到了另一种方法。创建一个类,用名称、等级...实例化它,然后使用操作员模块。例如。
class Student:
def __init__(self, name, grade):
self.name = name
self.grade = grade
def __repr__(self):
return repr((self.name, self.grade))
student_objects = [
Student('john', 15),
Student('jane', 12),
Student('dave', 10),
]
from operator import attrgetter
>>> sorted(student_objects, key=attrgetter('grade', 'name'))
[('alex', 15), ('john', 15), ('allen', 17), ('jane', 20)]
诀窍在于,使用 attrgetter,您可以在多个级别上进行排序。在这里,我按等级和名称排序。这不是被问到的吗?