按最常见字段排序的namedtupled列表

问题描述 投票:0回答:1

按列表中最常用的元素对namedtuple列表进行排序的一些优雅,快捷的简便方法是什么?

例如,我们有此列表

character_list = [
    Element(id=1, character='A'),
    Element(id=2, character='B'),
    Element(id=3, character='B'),
    Element(id=4, character='C'),
    Element(id=5, character='D'),
    Element(id=6, character='E'),
    Element(id=7, character='F'),
    Element(id=8, character='H'),
    Element(id=9, character='I'),
    Element(id=10, character='J'),
    Element(id=11, character='K'),
    Element(id=12, character='L'),
    Element(id=13, character='M'),
    Element(id=14, character='J'),
    Element(id=15, character='N'),
    Element(id=16, character='J')]

并像这样排序?

character_list = [
    Element(id=10, character='J'),
    Element(id=14, character='J'),
    Element(id=16, character='J'),
    Element(id=2, character='B'),
    Element(id=3, character='B'),
    Element(id=1, character='A'),
    Element(id=4, character='C'),
    Element(id=5, character='D'),
    Element(id=6, character='E'),
    Element(id=7, character='F'),
    Element(id=8, character='H'),
    Element(id=9, character='I'),
    Element(id=11, character='K'),
    Element(id=12, character='L'),
    Element(id=13, character='M'),
    Element(id=14, character='J'),
    Element(id=15, character='N')]

尝试一下,但似乎没有我想要的结果

sorted(character_list, key=lambda x: character_list.count(x.character))
python python-3.x sorting namedtuple
1个回答
0
投票

x.character从不在列表中。无论如何,像这样使用list.count非常无效。排序为O(N * log N),但是,如果键功能使用list.count,它将使所有内容恶化为O(N ** 2)。

而是建立一个计数字典,并使用该字典,这将保持您的O(N * log N)性能。因此给定:

>>> from pprint import pprint
>>> pprint(character_list)
[Element(id=1, character='A'),
 Element(id=2, character='B'),
 Element(id=3, character='B'),
 Element(id=4, character='C'),
 Element(id=5, character='D'),
 Element(id=6, character='E'),
 Element(id=7, character='F'),
 Element(id=8, character='H'),
 Element(id=9, character='I'),
 Element(id=10, character='J'),
 Element(id=11, character='K'),
 Element(id=12, character='L'),
 Element(id=13, character='M'),
 Element(id=14, character='J'),
 Element(id=15, character='N'),
 Element(id=16, character='J')]

然后

>>> from collections import Counter
>>> counts = Counter(e.character for e in character_list)
>>> counts
Counter({'J': 3, 'B': 2, 'A': 1, 'C': 1, 'D': 1, 'E': 1, 'F': 1, 'H': 1, 'I': 1, 'K': 1, 'L': 1, 'M': 1, 'N': 1})

最后,

>>> def keyfunc(e):
...     return counts[e.character]
...
>>> sorted_character_list = sorted(character_list, key=keyfunc, reverse=True)
>>> pprint(sorted_character_list)
[Element(id=10, character='J'),
 Element(id=14, character='J'),
 Element(id=16, character='J'),
 Element(id=2, character='B'),
 Element(id=3, character='B'),
 Element(id=1, character='A'),
 Element(id=4, character='C'),
 Element(id=5, character='D'),
 Element(id=6, character='E'),
 Element(id=7, character='F'),
 Element(id=8, character='H'),
 Element(id=9, character='I'),
 Element(id=11, character='K'),
 Element(id=12, character='L'),
 Element(id=13, character='M'),
 Element(id=15, character='N')]
© www.soinside.com 2019 - 2024. All rights reserved.