如何让元组显示每个人的总和而不是单独显示?

2024-09-29 21:24:16 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我得到了这本字典,它的键是名称,它有三个元组:在三元组中,一个股票名称,交易的股票数量(int)和每股的价格(int)。你知道吗

new_dict = {
    'Carl': [('Intel', 30, 40), ('Dell' , 20, 50), ('Intel',-10, 60), 
('Apple', 20, 55)],
    'Barb': [('Intel', 20, 40), ('Intel',-10, 45), ('IBM',   40, 30), 
('Intel',-10, 35)],
    'Alan': [('Intel', 20, 10), ('Dell',  10, 50), ('Apple', 80, 80), ('Dell', 
-10, 55)],
    'Dawn': [('Apple', 40, 80), ('Apple' ,40, 85), ('Apple',-40, 90)]
  }

我正在创建一个函数,返回一个由两个元组组成的列表,结果是(client)和他们卖出(负num)或买入(正num)股票总数的绝对值。 -列表根据其交易的股票数量之和按降序排列;如果两个客户交易相同数量的股票,则必须按字母顺序递增。

对于新字典,输出应该是[('Alan',120),('Dawn',120),('Barb',80),('Carl',80)]

以下是我所做的:

def most_active_clients(database :{str: (str, int, int)}) -> list:
        result = []
        t = list()

        for key,val in database.items():
            for x in val:
                t.append((key,abs(x[1])))
                for item in t:
                    print(item)

我似乎不知道如何求出所有x[1]的和,然后对其排序。有人能帮我吗?你知道吗


Tags: inapplefor数量字典交易dellint
3条回答

分两步进行:

  • 首先,计算每一个的绝对份额之和,并将结果存储在一个新的dict中
  • 然后,对结果进行排序。你知道吗

代码如下:

abs_shares = {(key, sum(abs(x[1]) for x in val)) for key, val in new_dict.items()}
print(sorted(abs_shares, key=lambda x: (-x[1], x[0])))

输出如预期:[('Alan', 120), ('Dawn', 120), ('Barb', 80), ('Carl', 80)]

使用排序方法

new_dict = {
    'Carl': [('Intel', 30, 40), ('Dell', 20, 50), ('Intel', -10, 60),
             ('Apple', 20, 55)],
    'Barb': [('Intel', 20, 40), ('Intel', -10, 45), ('IBM', 40, 30),
             ('Intel', -10, 35)],
    'Alan': [('Intel', 20, 10), ('Dell', 10, 50), ('Apple', 80, 80), ('Dell',
                                                                      -10, 55)],
    'Dawn': [('Apple', 40, 80), ('Apple', 40, 85), ('Apple', -40, 90)]
}


def most_active_clients(new_dict):
    res = []

    for k, v in new_dict.items():
        name = k
        sum = 0
        for l in v:
            sum += abs(l[1])
        res.append((name, sum))

    return sorted(res, key=lambda x: (-x[1], x[0]), reverse=False)


print(most_active_clients(new_dict))

我已经用我觉得简单的方式实现了。你知道吗

你需要的是

return sorted(res, key=lambda x: (-x[1], x[0]), reverse=False)

这是获得结果的一种方法:

database = {
    'Carl': [('Intel', 30, 40), ('Dell' , 20, 50), ('Intel',-10, 60), 
('Apple', 20, 55)],
    'Barb': [('Intel', 20, 40), ('Intel',-10, 45), ('IBM',   40, 30), 
('Intel',-10, 35)],
    'Alan': [('Intel', 20, 10), ('Dell',  10, 50), ('Apple', 80, 80), ('Dell', 
-10, 55)],
    'Dawn': [('Apple', 40, 80), ('Apple' ,40, 85), ('Apple',-40, 90)]
  }


t = []
for key, val in database.items():
    for x in val:
        t.append((key,abs(x[1])))

a_set = {x[0] for x in t}
res = sorted([(i,sum(x[1] for x in t if x[0] == i)) for i in a_set], key=lambda x: x[1], reverse=True)

print(res)
# [('Alan', 120), ('Dawn', 120), ('Barb', 80), ('Carl', 80)]

相关问题 更多 >

    热门问题