Как собрать 5 случайных выборок dict?

Я пытаюсь выбрать 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.

Результат, который я ищу, - это только название элементов и сумма 5 случайных элементов.

NIPPE 17.12.2022 14:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Случайные слова

Чтобы получить случайные диктовки, вы можете сделать это следующим образом.

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))
Ответ принят как подходящий

Вам плевать на ключи 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)

Это не быстрый или питонический способ (они предлагаются в других ответах), но именно так вы должны визуализировать при обработке вложенных типов данных. Как только вы это поймете, вы сможете приступить к оптимизации или украшению кода.

Другие вопросы по теме