Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 25, 2021 17:59:34

izooomrud
Зарегистрирован: 2021-01-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать из словаря элементы по условию

Привет.
Есть ли в питоне функция позволяющая выбрать из словаря элементы по заданному условию, к примеру есть словарь

 a = {"gear": {"stock1": {100}, "stock2": {101}, "stock3": {100}}, "engine": {"stock1": {100}}}
из которого нужно взять элементы в которых одинаковый ключ “gear”, а разница между значениями stock 1%.
Перебором в цикле у меня получается сравнить только значения stock1 с stock2 и stock1 с stock3, а stock2 с stock3 упускается.

Офлайн

#2 Янв. 25, 2021 20:56:28

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Выбрать из словаря элементы по условию

>> есть словарь из которого нужно взять элементы в которых одинаковый ключ “gear”
В словаре не может быть несколько элементов с одинаковым ключем. Поэтому ваш вопрос лише смысла, нужен элемен с ключем key, так берите его:

 dict[key]
Опишите более внятно что вы хотите:



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Янв. 25, 2021 23:39:44

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Выбрать из словаря элементы по условию

Более внятно это значит приведите код который вы написали.
Приведите пример в котором будут как включенные в вывод результаты так и не включенные.
Напишите что должно получиться и почему.

Постановка задачи - включить элементы отличающиеся не более чем на 1 процент неясна.

вот ряд чиcел. 1,2,3,4,5,6,7,8 Если надо привести набор чисел отличающихся не более чем на 1.5 что надо включать? 1,2 или 2,3 или 1,2,3 ?



Офлайн

#4 Янв. 26, 2021 19:45:29

izooomrud
Зарегистрирован: 2021-01-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать из словаря элементы по условию

PEHDOM
В словаре не может быть несколько элементов с одинаковым ключем
Не может быть, но
 for item in a
    for stock in item
когда первый for пройдёт одну итерацию и дойдёт до ключа engine, то определенное условие сравнения внутри второго for начнёт обрабатывать значения между значениями storeX внешних ключей gear и engine, а нужно только внутри gear, потому я и написал одинаковый ключ. Видимо из-за плохого понимания подхода я объяснить грамотно не могу, но очень пытаюсь

В целом мне нужно собрать значения между storeХ, где внешний ключ “gear”, которые отличаются между собой на 1%. То как я пытаюсь это сделать не может сравнить все значения между собой, а только первое со всеми остальными.

 a = {"gear": {"stock1": 100, "stock2": 101, "stock3": 100}, "engine": {"stock1": 100}}
start_key = ''
firth_value = 0
firth_stock = ''
out = {}
for item, values in a.items():
    for stock, count in values.items():
        if start_key != item or start_key == '':
            start_key = item
            firth_value = count
            firth_stock = stock
        elif start_key == item:
            if firth_value / count >= 1.01 or count / firth_value >= 1.01:
                out = {item: {firth_stock + '/' + stock, firth_value, count}}
print(out)

А в итоге я пытаюсь получить такой словарь:

{“gear”: {0: {“stock1/stock2”, 100, 101}, 1: {“stock2/stock3”, 101, 100}}}

Офлайн

#5 Янв. 26, 2021 23:56:41

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Выбрать из словаря элементы по условию

izooomrud
собрать значения между storeХ, где внешний ключ “gear”, которые отличаются между собой на 1%
Насколько я понимаю русский язык такое допускает с трудом.
Люди когда пишут “между” дальше пишут “a” и “b”.
после “где внешний ключ “gear”” обычно пишут равен, меньше или еще чтото в этом роде.

izooomrud
То как я пытаюсь это сделать не может сравнить все значения между собой
У вас не получается потому что это вообще невозможно сделать. Нет такой математической операции сравнить между собой N элементов. Операция сравнения действует только на два элемента.
Есть понятие диаметр множества
https://neerc.ifmo.ru/wiki/index.php?title=Диаметр_множества_точек_(вращающиеся_калиперы)
Стандартное отклонение
https://ru.wikipedia.org/wiki/Среднеквадратическое_отклонение

Давайте зайдем с другой стороны
izooomrud
А в итоге я пытаюсь получить такой словарь:
Зачем вы его пытаетесь получить? Вам задали или вы сами это придумали?
Если задали, то может покажете задание?
Если сами придумали, то может объясните как вы этот словарь будете использовать. На первый взгляд он ничем не лучше исходного.
Попробуйте вообще без всяких там программистских хитростей изложить что вам надо. Опишите вот есть магазин, хочу найти похожие товары… и т.п.



Отредактировано doza_and (Янв. 27, 2021 00:02:02)

Офлайн

#6 Янв. 27, 2021 02:48:34

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9882
Репутация: +  853  -
Профиль   Отправить e-mail  

Выбрать из словаря элементы по условию

doza_and
Нет такой математической операции сравнить между собой N элементов.
На самом деле, есть. Надо просто дать определение, определить множество-носитель и определить систему аксиом. Получится n-арная операция сравнения. Например, операция сложения на множестве целых чисел есть левая и есть правая. И это две разные операции сложения. Потом доказывается, что результаты этих операций равны и таким образом вводится коммутативность операции сложения на множестве целых чисел. То есть там две операции остались, просто принято говорить, что она там типа одна. А вот у матриц как раз можно посмотреть, как правое умножение не равно левому умножению, и поэтому операция умножения матриц не коммутативна, поэтому две операции умножения на множестве матриц никуда не делись, а результаты у них не равны. Соответственно, и операции бывают не только бинарные. Бинарные - это просто те, у которых n = 2, а n может быть и больше двух.
А сравнение - это вообще отношение, а не операция. Но это тоже просто бинарное отношение, у которого n = 2.



Отредактировано py.user.next (Янв. 27, 2021 02:50:38)

Офлайн

#7 Янв. 27, 2021 03:53:43

izooomrud
Зарегистрирован: 2021-01-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать из словаря элементы по условию

doza_and
Вам задали или вы сами это придумали?
Я его сам придумал. В общем, есть 3 склада с разными товарами, нужно выбрать из массива все однотипные товары имеющие отличие в их количестве между собой на заданный %. Как бы с применением mysql это не сложно сделать, но можно ли одними массивами?

Офлайн

#8 Янв. 27, 2021 08:26:05

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Выбрать из словаря элементы по условию

Так значительно понятнее. Все равно программная реализация невозможна из за нечеткости постановки. А уточнение затруднено тем что непонятно какие действия вы хотите предпринять. Вы выравниваете число товаров по складам?
У вас путаются реальность - склады и виртуальность - массивы.

izooomrud
Как бы с применением mysql это не сложно сделать, но можно ли одними массивами?
Тут непонятно. Это утверждение что на mysql не сложно или вопрос? По поводу массивов тоже вы о чем? у вас там исключительно словари.

Попробую сформулировать.
Имеется N складов (ни один программист в здравом уме не будет фиксировать число складов).
На них имеются товары с заданным строкой - именем, количество которых характеризуется плавающим числом. (заметьте никакой однотипности строка совпала или нет)
Найти имена товаров, максимальное количество которых на складах отличается от минимального не более чем на заданную долю от их среднего значения на складах.
 from collections import defaultdict
delta =0.01
# имен складов нет - они не нужны для решения задачи
# на каждом складе надо перечислить все товары
sckladList =[{"a":5.5,"b":3,"c":0.},{"a":5.5,"b":8.,"c":4.}]
# формируем списки количеств товаров на складах
amo=defaultdict(list)
for scklad in sckladList:
    for k,v in scklad.items():
        amo[k].append(v)
# выбираем имена товаров удовлетворяющих условию
out = [k for k,v in amo.items() if 1-delta < (max(v)-min(v))/mean(v) < 1+delta]
Я не проверял, могут быть ошибки но идея думаю ясна.
Не думаю что на SQL будет проще. по сути там тоже самое получится.



Офлайн

#9 Янв. 27, 2021 21:32:56

izooomrud
Зарегистрирован: 2021-01-16
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбрать из словаря элементы по условию

doza_and
Это утверждение что на mysql не сложно или вопрос?
Это субъективное суждение, что к mysql это всего 1 запрос, что бы сформировать такой ответ.
doza_and
По поводу массивов тоже вы о чем? у вас там исключительно словари
На сколько я понимаю, то словарь это и есть массив, только ассоциативный.

Собсно я тут подумал - почему бы не сделать так?

 a = {"gear": {"stock1": 100, "stock2": 101, "stock3": 100}, "engine": {"stock1": 100}}
out = {}
for item, values in a.items():
    for stock, count in values.items():
        for i, v in values.items():
            if count / v >= 1.01:
                if item in out:
                    out[item].append([i + '/' + stock, v, count])
                else:
                    out = {item: [i + '/' + stock, v, count]}
print(out)

Конечно изначально вопрос стоял о штатной функции, которая делает подобное, но и так сойдёт

Офлайн

#10 Янв. 27, 2021 22:39:31

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1371
Репутация: +  121  -
Профиль   Отправить e-mail  

Выбрать из словаря элементы по условию

izooomrud
А в итоге я пытаюсь получить такой словарь:

{“gear”: {0: {“stock1/stock2”, 100, 101}, 1: {“stock2/stock3”, 101, 100}}}
Непонятно как вы дальше собираетесь использовать эти данные, выглядит сложно для дальнейших операций с данными в таком виде

Онлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version