gpt4 book ai didi

Python:按项目频率对元组列表进行排序

转载 作者:行者123 更新时间:2023-11-30 23:20:59 28 4
gpt4 key购买 nike

假设我有一个列表:

tmp = [((0,0), (1,1)), ((1,2), (3,4)), ((1,2), (5,6))]

我想对其进行排序,使其按最频繁的对排序,其中“最频繁的对”是由第一个位置中每对元组的频率定义的:

>>> [((1, 2), (3, 4)), ((1, 2), (5, 6)), ((0, 0), (1, 1))] # desired

1) 我尝试使用 lambda 编写一个简单的表达式,但不成功:

tmp = sorted(tmp, key = lambda x: -tmp.count(x[0]))

2)我通过使用collections.Counter设法达到了预期的结果:

c = collections.Counter(x[0] for x in tmp)
tmp = sorted(tmp, key = lambda x: -c[x[0]])

我的问题:为什么方法 1) 不正确?还有比方法 2) 更好的选择吗?

最佳答案

In [54]: tmp = [((0,0), (1,1)), ((1,2), (3,4)), ((1,2), (5,6))]

In [55]: counts = collections.Counter(t[0] for t in tmp)

In [56]: sorted(tmp, key=lambda t:counts[t[0]])
Out[56]: [((0, 0), (1, 1)), ((1, 2), (3, 4)), ((1, 2), (5, 6))]

In [57]: sorted(tmp, key=lambda t:counts[t[0]], reverse=True)
Out[57]: [((1, 2), (3, 4)), ((1, 2), (5, 6)), ((0, 0), (1, 1))]

您的第一种方法不正确,因为tmp中不存在x[0]。相反,它存在于 tmp

中某处的元组中

我对你的第二种方法做了一点改进。它无需乘以 -1

<小时/>

我真的不建议这样做,但如果您确实想让第一种方法发挥作用,您可以计算所有以 x[0] 作为第一个元素的元组:

In [58]: sorted(tmp, key=lambda t:len([tup for tup in tmp if tup[0]==t[0]]), reverse=True)
Out[58]: [((1, 2), (3, 4)), ((1, 2), (5, 6)), ((0, 0), (1, 1))]

关于Python:按项目频率对元组列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25151077/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com