Я пытаюсь выбрать 5 элементов из dict, а затем объединить их по сумме. В этом случае путем построения суммы всех 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.






Чтобы получить случайные диктовки, вы можете сделать это следующим образом.
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
sum(random.sample([x['price'] for x in mydict.values()], 5))
Вам плевать на ключи 1, 2, 3, просто используйте mydict.values()
Затем возьмите у вас список из 5 диктовок {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))
Просто чтобы добавить к существующим ответам, вам следует рассмотреть возможность печати переменных на каждом этапе, когда тип переменной не ясен.
Функция суммы многократно вызывает оператор +, эквивалентный классу (метод __add__).
Здесь у вас есть dict of dicts. У вас есть ключи от 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 (типа 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)
Это не быстрый или питонический способ (они предлагаются в других ответах), но именно так вы должны визуализировать при обработке вложенных типов данных. Как только вы это поймете, вы сможете приступить к оптимизации или украшению кода.
Результат, который я ищу, - это только название элементов и сумма 5 случайных элементов.