Python 如何让元组显示每个人的总和,而不是单独显示?
所以我得到了这本字典,它的键是名字;它有3个值的元组:在3元组中,有一个股票名称、该交易的股票交易数量(int)和每股价格(int) 我正在创建一个函数,该函数返回一个2元组列表作为结果(客户端,以及他们出售或购买的股份总数的绝对值(负num)或(正num)。 -列表根据其交易的股票数量之和按降序排列;如果两个客户交易相同数量的股票,则必须按字母顺序递增。 对于新词典,输出应该是[('Alan',120),('Dawn',120),('Barb',80),('Carl',80)] 以下是我所做的:Python 如何让元组显示每个人的总和,而不是单独显示?,python,python-3.x,Python,Python 3.x,所以我得到了这本字典,它的键是名字;它有3个值的元组:在3元组中,有一个股票名称、该交易的股票交易数量(int)和每股价格(int) 我正在创建一个函数,该函数返回一个2元组列表作为结果(客户端,以及他们出售或购买的股份总数的绝对值(负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]的总和,然后对其进行排序。有人能帮我吗?这是一种获得结果的方法:
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)]
使用排序法
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)
分两步进行:
- 首先,计算每个股票的绝对和,并将结果存储在新的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)]
答案很好,很容易理解。请参阅我的答案,以获得使用听写理解而不是这两个for循环的较短代码。
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])))