这个def语句如何变得更紧凑?

时间:2017-05-28 20:20:52

标签: python function

获取带有dict作为输入的列表。 dict中的键是得分。 输出是一个从高到低分数的列表。

def sort_scores(self, data):
        scores = []
        for i in data:
            scores = scores + list(map(lambda score_str: int(score_str), i.keys()))
        sorted_scores = list(map(lambda score_int: str(score_int), reversed(sorted(scores))))
        return sorted_scores

2 个答案:

答案 0 :(得分:2)

缩短这个的很多方法:

map(lambda score_str: int(score_str), i.keys())

表达式lambda score_str: int(score_str)可以写成int,如果您正在调用该函数,则无需映射lambda

如果您想迭代字典,请不要打扰i.keys(),只需使用i

这会给你:

list(map(int, i))

但如果你使用列表理解,它会更容易阅读(虽然稍长):

scores = scores + [int(score_str) for score_str in i]

你也可以将for循环嵌套在列表理解中,但是短路并不总是更好,所以我建议不要这样做。

scores = [int(score_str) for i in data for score_str in i]

这同样适用于最后一部分:

sorted_scores = list(map(lambda score_int: str(score_int), reversed(sorted(scores))))

可以是:

 sorted_scores = [ str(score_int) for score_int in sorted(scores, reverse=True)]

你应该养成在排序时使用reverse参数的习惯,这里没关系,但有些情况下反向排序与排序和反转不同。

此外,您可以使用key上的sort参数来避免广播:

scores = [score_str for i in data for score_str in i]
sorted_scores = sorted(scores, reverse=True, key=int)

答案 1 :(得分:0)

一般来说,最好避免使用map& lambda,它产生非常难以理解的代码。列表理解是Python的发展方向。

以下是3个非常易读的行中的相同代码(您不需要这个函数)

scores = sorted([int(score_str)
                 for i in data
                 for score_str in i], reverse=True)