在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中使用最后一个字符频率对二维列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章