我试图从字典中抽样5个项目,然后按总和汇总它们。在本例中,通过构建所有5个价格的总和。我怎么做呢?
import random
mydict = {
1: {"name":"item1","price": 16},
2: {"name":"item2","price": 14},
3: {"name":"item3","price": 16},
4: {"name":"item4","price": 14},
5: {"name":"item5","price": 13},
6: {"name":"item6","price": 16},
7: {"name":"item7","price": 11},
8: {"name":"item8","price": 12},
9: {"name":"item9","price": 14},
10: {"name":"item10","price": 14},
}
randomlist = random.sample(mydict.items(), 5)
print(sum(randomlist)) # This line needs to work properly.
你不关心键1, 2, 3
,只使用mydict.values()
然后你有一个5个dict的列表{name:,price:}
,取所有的名字,和所有的价格之和
randomlist = random.sample(list(mydict.values()), 5)
print("Prices of", ",".join(item['name'] for item in randomlist))
print(sum(item['price'] for item in randomlist))
随机字典
要获得随机字典,您可以这样做。
randomlist = random.sample(list(mydict.items()), 5)
dict(randomlist)
结果:
{10: {'name': 'item10', 'price': 14},
8: {'name': 'item8', 'price': 12},
7: {'name': 'item7', 'price': 11},
9: {'name': 'item9', 'price': 14},
5: {'name': 'item5', 'price': 13}}
快速获取最终和
但是如果你只寻找最终价格的总和,你可以做得快一点。
randomlist = random.sample(list(mydict.values()), 5)
sum(x['price'] for x in randomlist)
结果:
69.0
V3
sum(random.sample([x['price'] for x in mydict.values()], 5))
只是为了添加到现有的答案中,当变量的类型不清楚时,您应该考虑在每个步骤中打印变量。
sum函数重复调用类的+运算符(__add__
方法)。
这里,你有字典的字典。键1到10映射10个字典。当您从它们中随机抽取一个时,您将得到一个元组(key, inner_dict)
(我事先不知道这一点,我将其打印出来以查找),你必须进一步打开包装才能得到具体的价格。
当我执行randomlist = random.sample(mydict.items(), 2)
并打印randomlist
时,输出是包含键和值的元组列表,如下所示
[(6, {'name': 'item6', 'price': 16}), (1, {'name': 'item1', 'price': 16})]
现在,这是sum
函数的实现。如何实现类的内置sum() ?
def sum(sequence, start=0):
for value in sequence:
start = start + value
return start
如您所见,它将初始值默认为0,并在可迭代对象中反复添加实体(这里最外面的一个是list)。
所以它开始sum = 0 (int类型)并尝试执行0+(key,dict)
。因此,错误TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
。如果您将代码修改为以空元组开始,它将开始添加元组,因为您可以添加两个元组并获得一个元组。
randomlist = random.sample(mydict.items(), 5)
print(mysum(randomlist,start=())) # This line needs to work properly
现在我们尝试添加()
和(key,dict)
,结果是(key,dict)
,然后(key,dict)+(key1, dict1)
等等,它们是有效的。
现在,如果要在随机列表中添加所有价格,首先必须获得包含键和内部字典的所有元组。
total = 0
for tup in randomlist:
#now get the dictionary (2nd element from the tuple)
inner_dict = tup[1]
#now get price from inner dict
price = inner_dict['price']
total += price
print(total)
这不是快速或python的方式(在其他答案中建议),但这是在处理嵌套数据类型时必须可视化的方式。一旦您理解了这一点,您就可以继续优化或美化代码。