【问题标题】:Sorting a list based on associated scores [closed]根据相关分数对列表进行排序[关闭]
【发布时间】:2014-02-05 05:48:16
【问题描述】:

我正在寻求一些帮助,以根据以下内容在列表中创建一组项目 关联分数。为了解释它,请参阅下面的字典对象和我要生成的所需列表;

dict 对象的定义:

strScoresDict[uniqueID] = (itemElement1, itemElement2, associatedScore)

例子:

('item1', 'item2', 100)

('item1', 'item3', 40)

('item1', 'item4', 80)

('item2', 'item3', 40)

('item2', 'item4', 100)

('item3', 'item4', 20)

排序列表;

('item1', 'item2', 'item4', 'item3')

我的目标列表可以有超过 1000 个条目

关联分数是根据业务特定逻辑生成的,分数范围固定在0100之间。

【问题讨论】:

  • 您应该改进对问题的描述,您希望得到什么(示例)。
  • 我不确定您对字典进行清晰排序的规则。
  • 我要查找的输出需要检查关联分数的权重,并将分数最高的项目聚集在一起。如上图所示,例如 item1 和 item2 紧密关联,因此 item2 在 item1 之后,但 item2 和 item3 的关联分数比 item2 和 item4 低,因此序列需要将 item3 推出到 item4 下方。希望这有助于澄清我正在寻找的输出。
  • @ipyinwild 你需要一个传递关系才能进行排序,我不清楚你的关系是传递的。你真的想排序,而不是集群吗?为什么item1 排在第一位?你认为算法是确定性的吗?
  • 嗨 Giles,你说得对,我正在尝试创建集群。 item1 是第一个项目集群,然后是下一个。该算法应在评分过程中忽略已包含在集群中的项目。

标签: python list sorting


【解决方案1】:

我会这样处理:

from collections import defaultdict # using defaultdict makes the sums easier

correlations = defaultdict(int) # default to int (i.e. 0)

for i1, i2, correl in strScoresDict: # loop through data
    correlations[i1] += correl # add score for first item
    correlations[i2] += correl # and second item

output = sorted(correlations, 
                key=lambda x: correlations[x], 
                reverse=True) # sort keys by value

但是请注意,输出是

output == ['item2', 'item1', 'item4', 'item3']

因为总相关性是

{'item1': 220, 'item3': 100, 'item2': 240, 'item4': 200}

你可以read about defaultdict here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多