【问题标题】:I have a list of tuples and i need to find the minimum of these using the value and if the values are same i need to sort them by key我有一个元组列表,我需要使用该值找到其中的最小值,如果值相同,我需要按键对它们进行排序
【发布时间】:2016-09-17 21:50:30
【问题描述】:
# Enter your code here. Read input from STDIN. Print output to STDOUT

    lst = list()
    name_grade = {}

    for i in range(int(raw_input())):

    name = raw_input()
    grade = float(raw_input())
    name_grade[name]= grade

tem = list()

for k,v in name_grade.items():
    tem.append((v,k))

sorted_list = sorted(tem)
second_low = min(sorted_list[1:])
T = tuple(second_low)
print T[1]

它适用于输入:

4
普拉尚
32
帕拉维
36
迪拉吉
39
希瓦姆
40

预期的 o/p : 帕拉维

但是当它具有相同的值时它失败了:

5
哈利
37.21
浆果
37.21
蒂娜
37.2
阿克里提
41
苛刻
39

O/P:

浆果

预期:

浆果
哈利

【问题讨论】:

  • 你的输出是正确的,它有 Berry 和 Tina 排序,因为他们有相同的数字 37.21
  • @busfault 我知道,但如果 2 名学生的成绩相同,他们希望我按字母顺序排序,目标是找到第二低的成绩,而这里 2 名的第二低成绩相同。我不知道如何再次按字母顺序排序
  • 存储一组公正的成绩然后对其进行排序会更有意义。还将成绩单存储到学生列表中。找到您想要的成绩后,用该成绩索引到字典中以获取您的学生列表。

标签: python list python-2.7 dictionary tuples


【解决方案1】:

我不是 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,您可以在多个级别上进行排序。在这里,我按等级和名称排序。这不是被问到的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2021-05-30
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    相关资源
    最近更新 更多