我在从数据集中获取正确的输出时遇到问题。
我有一个包含代码名称,权重和分数的数据集,并希望提取一个唯一的TIK,权重,分数列表,其中分数= MAX(分数)给定的代码。
数据集的一个例子是
[(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,直到总和(权重)= 100。
对于给定的体重,每个自动收报机只能报告一次。因此,如果AAPL在重量25时得分最高,则不能再以任何其他重量使用。
这很难解释,希望我已经为你们提供了足够的指导。
***附加了一些真实的样本数据,以便更加清晰
答案 0 :(得分:2)
>>> 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示例中的错误相对应
答案 1 :(得分:0)
好吧,如果不使用其他一些库,可以按照以下方式完成:
def get_element(lst, key):
for obj in lst:
if key(obj):
return obj
return None
def generate_list(data_set):
result = []
for obj in data_set:
temp = get_element(result, lambda k: k[0] == obj[0])
if temp is None:
result.append(obj)
elif obj[1] > temp[1]:
ind = result.index(temp)
result[ind] = obj
return result
会产生与输入相同的列表格式。
答案 2 :(得分:0)
许多有效答案。我的回答侧重于开发人员的可读性:
from collections import namedtuple
Share = namedtuple('Share', 'name weight score')
d = {}
for share in [Share(*i) for i in table]:
try:
d[share.name] = share if share.score > d[share.name][2]\
else d[share.name]
except KeyError:
d[share.name] = share
for share in d:
print repr(d[share][:]).strip('()')
>>> 'AAPL', 25, 400
>>> 'TITN', 25, 350
>>> 'ANF', 25, 250
在你的表中,似乎体重已经整合在分数中,因为每个体重点似乎代表10个分数点,并且体重和分数之间存在直接关联。
答案 3 :(得分:0)
嘿伙计们感谢您的反馈!我从你的意见中意识到我需要退后一步。
由于反对将每个权重分配给每个股票代码并尝试查询该数据集,我根据其总分给予股票代码一个独特的权重。
* 这使用已按最高分数排序的数据集。
x = (25, 20, 15, 10, 10, 10, 5, 5)
y = 0
for each in table:
if y > 7:
pass
else:
w = each[0], each[1], each[2], x[y]
print w
y += 1
感谢您的指导!而对于你的麻烦,这些是一些优质的股票......
(u'COOL ', 2.98, 0.54, 25)
(u'MIND', 23.96, 2.12, 20)
(u'SIMO', 22.35, 1.87, 15)
(u'RAVN', 65.35, 3.45, 10)
(u'AET', 43.93, 1.74, 10)
(u'SBUX', 47.6, 1.59, 10)
(u'ATVI', 12.56, 0.24, 5)
(u'CACI', 56.96, 1.04, 5)