[英]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.