我在从数据集中获取正确的输出时遇到问题。
我有一个包含股票代码名称、权重和分数的数据集,并且想要提取 TIK、权重、分数的唯一列表,其中给定股票代码的分数 = MAX(score)。
数据集的示例是
[(u'COOL ', 25, 452.50000000000006), (u'MIND', 25, 221), (u'SIMO', 25, 209), (u'RAVN', 25, 131.75), (u'AET', 25, 99), (u'SBUX', 25, 83.5), (u'ATVI', 25, 47.75), (u'CACI', 25, 45.5), (u'DISH ', 25, 17.25), (u'COOL ', 15, 271.5), (u'MIND', 15, 132.6), (u'SIMO', 15, 125.39999999999999), (u'RAVN', 15, 79.05), (u'AET', 15, 59.4), (u'SBUX', 15, 50.099999999999994), (u'ATVI', 15, 28.65), (u'CACI', 15, 27.3), (u'DISH ', 15, 10.35), (u'COOL ', 10, 181), (u'MIND', 10, 88.4), (u'SIMO', 10, 83.6), (u'RAVN', 10, 52.699999999999996), (u'AET', 10, 39.6), (u'SBUX', 10, 33.4), (u'ATVI', 10, 19.099999999999998), (u'CACI', 10, 18.2), (u'DISH ', 10, 6.8999999999999995), (u'COOL ', 5, 90.5), (u'MIND', 5, 44.2), (u'SIMO', 5, 41.8), (u'RAVN', 5, 26.349999999999998), (u'AET', 5, 19.8), (u'SBUX', 5, 16.7), (u'ATVI', 5, 9.549999999999999), (u'CACI', 5, 9.1), (u'DISH ', 5, 3.4499999999999997)]
.....对于数据集中的每个代码。
我希望实现的结果是:
COOL 25 452.50
MIND 15 132.6
SIMO 10 83.6
例如。 AAPL 的权重为 25,TITN 的权重为 20,ANF 的权重为 15,其相关分数的权重为 15,直到 sum(weight) = 100。
对于给定的重量,每个代码只能报告一次。因此,如果 AAPL 在权重 25 时得分最高,则不能在任何其他权重下再次使用。
这很难解释,希望我已经为你们提供了足够的指导。
***为了更加清晰而附加了一些真实的示例数据
最佳答案
>>> from itertools import groupby
>>>
>>> groups = groupby(table, lambda x: x[0]) # table not sorted because items already are
>>> [max(item[1], key=lambda x:x[2]) for item in groups]
[('AAPL', 25, 400), ('TITN', 25, 350), ('ANF', 25, 250)]
>>>
或者两行(只是为了好玩,抱歉):
>>> from itertools import groupby
>>> [max(item[1], key=lambda x:x[2]) for item in groupby(table, lambda x: x[0])]
[('AAPL', 25, 400), ('TITN', 25, 350), ('ANF', 25, 250)]
编辑:考虑到新表和OP给出的示例,我理解必须优先考虑表中每个步骤中可用的有效最大值来进行分析选择。然后使用:
table = [(u'COOL ', 25, 452.5), (u'MIND', 25, 221),
(u'SIMO', 25, 209), (u'RAVN', 25, 131.75), (u'AET', 25, 99),
.............................
(u'CACI', 5, 9.1), (u'DISH ', 5, 3.45)]
while table:
maxim = max(table, key= lambda x:x[2])
print maxim
table = [tup for tup in table if tup[1] != maxim[1] and tup[0] != maxim[0]]
打印:
(u'COOL ', 25, 452.5)
(u'MIND', 15, 132.59999999999999)
(u'SIMO', 10, 83.599999999999994)
(u'RAVN', 5, 26.350000000000001)
请注意,根据您连续选择项目所遵循的规则,结果会有所不同(请参阅下面的我的评论)。上面代码中选择的条件给出的结果更接近 OP 的结果。我的答案中的附加术语可能对应于OP示例中的错误
关于python - 如何获得该数据集的正确输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8899925/