L1-034 点赞(Python3)

本文介绍了一个编程问题,要求通过分析用户在微博上点赞的博文的特性标签,找出他们最常点赞的特性。利用Python代码实现,包括使用lambda函数进行排序和计数。
摘要由CSDN通过智能技术生成

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。

输入格式:

输入在第一行给出一个正整数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}')

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天草柑橘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值