鱼C论坛

 找回密码
 立即注册
查看: 2308|回复: 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我只用过同属性值相比较,复杂点的不知道咋用。我想计算综合得分值进行比较,不知道行不行。

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

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

  10. >>> n = list(sorted([A(1, 2), A(3, 4), A(5, 6)], key = cmp))
  11. >>> n[0].print_self()
  12. 1 2
  13. >>> n[1].print_self()
  14. 3 4
  15. >>> n[2].print_self()
  16. 5 6
  17. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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我只用过同属性值相比较,复杂点的不知道咋用。我想计算综合得分值进行比较,不知道行不行。

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

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

  10. >>> n = list(sorted([A(1, 2), A(3, 4), A(5, 6)], key = cmp))
  11. >>> n[0].print_self()
  12. 1 2
  13. >>> n[1].print_self()
  14. 3 4
  15. >>> n[2].print_self()
  16. 5 6
  17. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
  1. from collections import namedtuple
  2. Person = namedtuple('Person', 'name w h age edu netTime')
  3. data = [('张三', 70, 178, 20, '本科', 2), ('李四', 68, 178, 24, '研究生', 1), ('王五', 60, 170, 28, '大专', 3)]
  4. ps = [ Person(*d) for d in data]
  5. ps
  6. [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)]
  7. def f(d):
  8.     xs = list('赵钱孙李周郑王张卢崔刘')
  9.     xs_v = dict(zip(xs, range(len(xs), 0, -1)))  # 越排在前面,值越大
  10.     edu_v = {'大专': 1, '本科': 2, '研究生': 3}
  11.     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   # 具体算法可以根据需要自己改
  12. f(ps[0])
  13. 38.1
  14. sorted(ps, key=f)
  15. [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-3-29 20:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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