如何聚合字典的5个随机样本?



我试图从字典中抽样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的方式(在其他答案中建议),但这是在处理嵌套数据类型时必须可视化的方式。一旦您理解了这一点,您就可以继续优化或美化代码。

最新更新