繁体   English   中英

按对象属性的频率对列表进行排序

[英]sort list by frequency of an Attribute of objects

我有一份人员名单。 列表中的每个元素都是 class Person 的 object 并且具有 3 个属性:name、age、height。
我需要按列表中名称的频率对该列表进行排序,如果频率按字母顺序排列相同,则只使用排序,不使用循环。
示例(对象):

[<name=Ellie, age=20, height=1.74>,
 <name=Sebastian, age=15, height=1.7>,
 <name=Lukas, age=19, height=1.82>,
 <name=Lukas, age=19, height=1.81>,
 <name=Alex, age=19, height=1.8>
]
 -> 
[<name=Lukas, age=19, height=1.82>,
 <name=Lukas, age=19, height=1.81>,
 <name=Alex, age=19, height=1.8>,
 <name=Ellie, age=20, height=1.74>,
 <name=Sebastian, age=15, height=1.7>
]

只要列表包含其名称在名为name的 object 属性中断言的对象,这将起作用:

lst.sort(key= lambda x: (lst.count(x), x.name))

使用计数器和排序试试这个

lst = ['ellie', 'sebastian', 'lukas', 'lukas', 'alex']
lst = sorted(lst)
from collections import Counter
result = [item for items, c in Counter(lst).most_common()
          for item in [items] * c]
# Output of result


['lukas', 'lukas', 'alex', 'ellie', 'sebastian']
class People:
    def __init__(self, name, age,height):
        self.name = name
        self.age=age
        self.height=height
p1=People("John",36,5.8)
p2=People("Mary",24,5.6)
p3 = People("John", 42, 6.1)
p4=People("Mel",18,5.9)
p5=People("John",26,5.7)
p6=People("Mary",32,5.11)
baselist=[p1,p2,p3,p4,p5,p6]

basename=[]
for obj in baselist:
    basename.append((obj.name,obj.height))
basename.sort()
finalobjlist=[]
for i in basename:

    for j in baselist:
        if i[0]==j.name and i[1]==j.height:
            finalobjlist.append(j)
print("")
for i in finalobjlist:
    print(i.name,i.age,i.height)

注意:假设每个人的身高都是独一无二的,我已经对初始名称进行了排序,然后将其与原始对象的高度和名称进行比较,最后将其附加到一个新数组中。

Output:

John 26 5.7
John 36 5.8
John 42 6.1
Mary 32 5.11
Mary 24 5.6
Mel 18 5.9

最终的 ppl 对象存储在一个列表 (finalobjlist) 中。

所以我像你提到的那样制作了 class

class Person:
    def __init__(self,age,height,name) -> None:
        self.age = age
        self.name = name
        self.height = height

和喜欢的人的名单

a = [Person(1,1,"ellie"),Person(1,1,"sebastian"),Person(1,1,"lukas"),Person(1,1,"lukas"),Person(1,1,"alex")]

接下来我数一下频率

counts = {}
for i in a:
    if i.name not in counts:
        counts[i.name]=0
    counts[i.name]+=1
counts

并使用此键,您可以按照您要求的方式进行排序,请注意负数以您要求的方式提供 output

key = lambda element:(-counts[element.name],element.name)
k = sorted(a,key=key)

output 会像:

for i in k:
    print(i.name)
lukas
lukas
alex
ellie
sebastian

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM