在python中使用最后一个字符频率对二维列表进行排序

Posted

技术标签:

【中文标题】在python中使用最后一个字符频率对二维列表进行排序【英文标题】:Sort 2-D list with last character's frequancy in python 【发布时间】:2022-01-19 14:36:24 【问题描述】:

我想对二维列表进行排序 t = [[3, 3, 3, 'a'], [2, 2, 2, 'b'], [1, 1, 1, 'b']] 每个列表的最后一个字符的频率相反。 因为 b 是 2 次, a 是 1 次,所以排序列表应该是 t_sorted = [[2,2,2,'b'],[1,1,1,'b], [3,3,3,'a']] 我写了代码:

def mine(a):
    return t.count(a[-1])
t = [[3, 3, 3, 'a'], [2, 2, 2, 'b'], [1, 1, 1, 'b']]
print(sorted(t,key = mine, reverse = True))

但它不能正常工作。不使用 counter python 的正确方法是什么?

【问题讨论】:

“不能正常工作”:你能说得更具体点吗? 你为什么不想使用计数器?看起来正是适合这项工作的工具。 .count 解决方案的时间复杂度是二次方,而 Counter 可以很容易地得到线性复杂度。 【参考方案1】:

这是因为t 没有任何“a”或任何“b”。它有包含 'a's 和 'b's 的列表。

只需手动检查:

>>> t = [[3, 3, 3, 'a'], [2, 2, 2, 'b'], [1, 1, 1, 'b']]
>>> t.count('a')
0

最不容易混淆的方法是只为最后的元素创建一个(正确的)计数器——让我们只获取子列表的最后一个元素并将其转换为计数器:

from collections import Counter

t = [[3, 3, 3, 'a'], [2, 2, 2, 'b'], [1, 1, 1, 'b']]
my_count = Counter(elem[-1] for elem in t)

现在我们可以使用 Counter 对象作为我们的位置:

print(sorted(t,key = lambda x: my_count[x[-1]], reverse = True))

【讨论】:

【参考方案2】:

这是一个不使用 Counter 的(劣质)解决方案:

def mine(a):
    return [x[-1] for x in t].count(a[-1])

【讨论】:

以上是关于在python中使用最后一个字符频率对二维列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

python 二维FFT

在python中,如何按元素的频率对列表进行排序

Python 二维列表,用sorted函数怎么多重排序?

在python中查找数字列表的频率分布

计算列表中单词的频率并按频率排序

python对二维列表进行排序而不使用lambda