鱼C论坛

 找回密码
 立即注册
查看: 3080|回复: 7

[已解决]多属性数据排序问题

[复制链接]
发表于 2022-12-2 19:47:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
假如我有100组数据需要排序:   
它们共有的属性

体重:                 占比 10%   重的优先
身高:                 占比 15%   高的优先
姓氏:                 占比 10%   赵钱孙李周吴郑    优先顺序
上网时长:          占比 30%     长的优先
年纪:                占比 15%    大的优先
学历:                占比 20%    高的优先


有没有py库可以计算它们的综合数据大小进行排序,或者有什么算法可以计算。
谢谢。
最佳答案
2022-12-2 20:47:11
我不是第一个 发表于 2022-12-2 20:42
sorted我只用过同属性值相比较,复杂点的不知道咋用。我想计算综合得分值进行比较,不知道行不行。

你可以参考一下这个例子
>>> class A:
        def __init__(self, x, y):
                self.x = x
                self.y = y
        def print_self(self):
                print(self.x, self.y)

                
>>> def cmp(s):
        return s.x + s.y

>>> n = list(sorted([A(1, 2), A(3, 4), A(5, 6)], key = cmp))
>>> n[0].print_self()
1 2
>>> n[1].print_self()
3 4
>>> n[2].print_self()
5 6
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-2 20:25:06 | 显示全部楼层
可以通过sorted函数进行排序,确定其中的key参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-2 20:42:51 | 显示全部楼层
tommyyu 发表于 2022-12-2 20:25
可以通过sorted函数进行排序,确定其中的key参数

sorted我只用过同属性值相比较,复杂点的不知道咋用。我想计算综合得分值进行比较,不知道行不行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-2 20:47:11 | 显示全部楼层    本楼为最佳答案   
我不是第一个 发表于 2022-12-2 20:42
sorted我只用过同属性值相比较,复杂点的不知道咋用。我想计算综合得分值进行比较,不知道行不行。

你可以参考一下这个例子
>>> class A:
        def __init__(self, x, y):
                self.x = x
                self.y = y
        def print_self(self):
                print(self.x, self.y)

                
>>> def cmp(s):
        return s.x + s.y

>>> n = list(sorted([A(1, 2), A(3, 4), A(5, 6)], key = cmp))
>>> n[0].print_self()
1 2
>>> n[1].print_self()
3 4
>>> n[2].print_self()
5 6
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-2 21:53:06 | 显示全部楼层
估计只有单独弄循环,然后将每个值乘占比最后加起来再排序吧,这个规则都是你自己在写,肯定是没有现存的。把数据读到pandas然后为每一种属性排序加列算出占比得分,最后把这些分加起来,再排序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-2 22:37:37 | 显示全部楼层
gywjj 发表于 2022-12-2 21:53
估计只有单独弄循环,然后将每个值乘占比最后加起来再排序吧,这个规则都是你自己在写,肯定是没有现存的。 ...

大概已经弄出来了。每组不同属性的值差距是很大的,核心主要是要算出单个属性比分,对综合比分影响不大才行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-2 22:38:30 | 显示全部楼层
tommyyu 发表于 2022-12-2 20:47
你可以参考一下这个例子

谢谢给的代码,有启发。估计搞成了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-2 22:59:13 | 显示全部楼层
from collections import namedtuple
Person = namedtuple('Person', 'name w h age edu netTime')
data = [('张三', 70, 178, 20, '本科', 2), ('李四', 68, 178, 24, '研究生', 1), ('王五', 60, 170, 28, '大专', 3)]
ps = [ Person(*d) for d in data]
ps
[Person(name='张三', w=70, h=178, age=20, edu='本科', netTime=2), Person(name='李四', w=68, h=178, age=24, edu='研究生', netTime=1), Person(name='王五', w=60, h=170, age=28, edu='大专', netTime=3)]
def f(d):
    xs = list('赵钱孙李周郑王张卢崔刘')
    xs_v = dict(zip(xs, range(len(xs), 0, -1)))  # 越排在前面,值越大
    edu_v = {'大专': 1, '本科': 2, '研究生': 3}
    return xs_v[d.name[0]] * 0.1 + d.w*0.1 + d.h*0.15 + d.age*0.15 + edu_v[d.edu]*0.2 + d.netTime*0.3   # 具体算法可以根据需要自己改
f(ps[0])
38.1
sorted(ps, key=f)
[Person(name='王五', w=60, h=170, age=28, edu='大专', netTime=3), Person(name='张三', w=70, h=178, age=20, edu='本科', netTime=2), Person(name='李四', w=68, h=178, age=24, edu='研究生', netTime=1)]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-25 11:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表