我有一个元组列表,我需要使用该值找到这些元素的最小值,如果值相同,我需要按键对它们进行排序

时间:2016-05-20 14:54:31

标签: python list python-2.7 dictionary tuples

# 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
PRASHANT
32个
Pallavi
36个
Dheeraj
39个
Shivam
40

预期o / p: Pallavi

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

5
哈利
37.21
贝瑞
37.21
蒂娜
37.2
Akriti
41个
恶劣
39

O / P:

浆果

预期:

浆果
哈利

1 个答案:

答案 0 :(得分:0)

我不是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或whatnot。选择最适合手头问题的类型非常重要。

所以我得到的是这个,在运行之后:

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