微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。
输入格式:
输入在第一行给出一个正整数N(≤1000),是该用户点赞的博文数量。随后N行,每行给出一篇被其点赞的博文的特性描述,格式为“K F1⋯FK”,其中1≤K≤10,Fi(i=1,⋯,K)是特性标签的编号,我们将所有特性标签从1到1000编号。数字间以空格分隔。
输出格式:
统计所有被点赞的博文中最常出现的那个特性标签,在一行中输出它的编号和出现次数,数字间隔1个空格。如果有并列,则输出编号最大的那个。
输入样例:
4
3 889 233 2
5 100 3 233 2 73
4 3 73 889 2
2 233 123
输出样例:
233 3
num = int(input())
dict_feature = {}
for _ in range(num):
data = input().split()[1:]
for j in data:
# 将字符串转换为整数,因为我们要统计的是数字出现的次数
int_j = int(j)
if int_j not in dict_feature:
dict_feature[int_j] = 1
else:
dict_feature[int_j] += 1
# 将字典中的键值对按照值的降序和键的降序进行排序
list_dict = sorted(dict_feature.items(), key=lambda x: (-x[1], -x[0]))
# 打印排序后的字典的第一个元素,即出现次数最多的数字及其出现次数
# 格式化输出,数字和次数之间用空格分隔
print('{} {}'.format(list_dict[0][0], list_dict[0][1]))
匿名函数
在Python中,lambda
是一个关键字,用于创建匿名函数(也称为lambda函数)。lambda
函数是一种简单的、一次性的函数,通常用于简短的、简单的操作,如作为参数传递给其他函数。
lambda
函数的基本语法如下:
lambda arguments: expression
arguments
是传递给lambda函数的参数列表,可以包含任意数量的参数,多个参数之间用逗号分隔。expression
是一个关于这些参数的表达式,它会在函数被调用时执行,并返回其结果。
让我们详细解释一下 sorted(dict_feature.items(), key=lambda x: (-x[1], -x[0]))
这行代码:
-
sorted(...)
: 这是Python的内置函数,用于对序列(如列表、元组、字典等)进行排序。 -
dict_feature.items()
: 这调用了一个字典的items()
方法,它返回一个视图对象,显示字典dict_feature
中的所有键值对。每个键值对都是一个元组,形式为(key, value)
。 -
key=lambda x: (-x[1], -x[0])
: 这是sorted
函数的key
参数,它指定了排序的依据。这里的key
是一个 lambda 函数,它定义了排序的逻辑。
lambda 函数 lambda x: (-x[1], -x[0])
的工作原理如下:
-
x
: 这是sorted
函数中传入的每个元素的别名。在这个上下文中,x
代表字典dict_feature
中的一个键值对,形式为(key, value)
。 -
-x[1]
: 这是x
的第二个元素(即字典项的值)的相反数。这意味着我们将按照值的降序进行排序。 -
-x[0]
: 这是x
的第一个元素(即字典项的键)的相反数。这意味着如果两个项的值相同,我们将按照键的降序进行排序。
综上所述,sorted(dict_feature.items(), key=lambda x: (-x[1], -x[0]))
这行代码的作用是对字典 dict_feature
中的项进行排序。排序的依据是每个项的值的相反数和键的相反数。这样,我们首先按照每个项的值降序排序,如果值相同,则按照键降序排序。
代码优化
# 使用字典的get方法来简化计数逻辑
for j in data:
# 使用int(j)直接转换,无需额外变量
dict_feature[int(j)] = dict_feature.get(int(j), 0) + 1
这段代码中,dict_feature.get(int(j), 0) + 1
的作用是:
- 如果
int(j)
这个键已经存在于dict_feature
中,那么dict_feature.get(int(j), 0)
将返回这个键对应的值,然后将其加1
。 - 如果
int(j)
这个键不存在于dict_feature
中,那么dict_feature.get(int(j), 0)
将返回默认值0
,然后将其加1
,从而将这个键添加到字典中,并将其值设置为1
。
# 打印排序后的字典的第一个元素,即出现次数最多的数字及其出现次数
# 使用元组拆包和格式化输出,数字和次数之间用空格分隔
most_common_feature, count = list_dict[0]
print(f'{most_common_feature} {count}')
优化后代码:
num = int(input())
dict_feature = {}
for _ in range(num):
data = input().split()[1:]
# 使用字典的get方法来计数
for j in data:
# 使用int(j)直接转换,无需额外变量
dict_feature[int(j)] = dict_feature.get(int(j), 0) + 1
# 将字典中的键值对按照值的降序和键的降序进行排序
list_dict = sorted(dict_feature.items(), key=lambda x: (-x[1], -x[0]))
# 打印排序后的字典的第一个元素,即出现次数最多的数字及其出现次数
# 使用元组拆包和格式化输出,数字和次数之间用空格分隔
most_common_feature, count = list_dict[0]
print(f'{most_common_feature} {count}')