首页 > 解决方案 > 需要澄清元组列表程序中第二个元素的频率排序

问题描述

from collections import Counter

test_list = [(6, 5), (2, 7), (2, 5), (8, 7), (9, 8), (3, 7)]

freq_2ndEle=Counter(val for key,val in test_list)

res=sorted(test_list,key=lambda ele:freq_2ndEle[ele[1]],reverse=True)

print(res)

请澄清代码是如何工作的,尤其是这部分

res=sorted(test_list,key=lambda ele:freq_2ndEle[ele[1]],reverse=True)

我对 ele:freq_2ndEle[ele[1]].

标签: python

解决方案


这是一个解释 - 将来,您应该尝试遵循类似的步骤,包括阅读文档:

  • Counter将可迭代对象或映射作为参数。在你的情况下,val for key,val in test_list是一个可迭代的。您从中获取值test_list并将它们提供给Counter.

  • 您不需要key, val语义,在这种情况下会令人困惑,因为它表明您正在遍历字典。相反,您正在遍历一个元组列表,因此freq_2ndEle=Counter(tp[1] for tp in test_list)更加清晰 - 在这里您可以访问第二个元组元素,索引为1.

  • Counter为您提供每个第二个元组元素的出现次数。如果您打印freq_2ndEle,您将看到: Counter({7: 3, 5: 2, 8: 1}),这是一对每个第二个元素出现在列表中的次数。

  • 在最后一步中,您将使用第二个元素的频率对原始列表进行排序sorted

    res=sorted(test_list,key=lambda ele:freq_2ndEle[ele[1]],reverse=True)

  • 因此,您将test_list作为排序的参数,然后指定key要排序的依据:在您的情况下,键是第二个元组元素发生的时间。

  • freq_2ndEle存储第二个第二个元素名称的键值对:它出现的时间test_list- 它在某种程度上是一个字典,所以你访问它就像访问字典一样,也就是说 - 你得到对应于ele[1]哪个值的值是(名称) 的第二个元组元素。名称不是基本术语,但我认为它可能更清楚。您获取的值freq_2ndEle[ele[1]]正是ele[1]发生的时间test_list

  • 最后,您对键进行排序,但顺序相反 - 即从高到低,[(2, 7), (8, 7), (3, 7), (6, 5), (2, 5), (9, 8)]将具有相同键(如 7 和 5)的值组合在一起。请注意,根据文档sorted是稳定的,这意味着它将保留输入中元素的顺序,这就是为什么当键相同时,您按照test_listie (2,7) 中的顺序获取它们,然后 (3 ,7) 最后在“7”组中。


推荐阅读