Найти - Пользователи
Полная версия: Выбрать из словаря элементы по условию
Начало » Python для новичков » Выбрать из словаря элементы по условию
1 2
izooomrud
Привет.
Есть ли в питоне функция позволяющая выбрать из словаря элементы по заданному условию, к примеру есть словарь
 a = {"gear": {"stock1": {100}, "stock2": {101}, "stock3": {100}}, "engine": {"stock1": {100}}}
из которого нужно взять элементы в которых одинаковый ключ “gear”, а разница между значениями stock 1%.
Перебором в цикле у меня получается сравнить только значения stock1 с stock2 и stock1 с stock3, а stock2 с stock3 упускается.
PEHDOM
>> есть словарь из которого нужно взять элементы в которых одинаковый ключ “gear”
В словаре не может быть несколько элементов с одинаковым ключем. Поэтому ваш вопрос лише смысла, нужен элемен с ключем key, так берите его:
 dict[key]
Опишите более внятно что вы хотите:
doza_and
Более внятно это значит приведите код который вы написали.
Приведите пример в котором будут как включенные в вывод результаты так и не включенные.
Напишите что должно получиться и почему.

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

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

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

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

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

py.user.next
doza_and
Нет такой математической операции сравнить между собой N элементов.
На самом деле, есть. Надо просто дать определение, определить множество-носитель и определить систему аксиом. Получится n-арная операция сравнения. Например, операция сложения на множестве целых чисел есть левая и есть правая. И это две разные операции сложения. Потом доказывается, что результаты этих операций равны и таким образом вводится коммутативность операции сложения на множестве целых чисел. То есть там две операции остались, просто принято говорить, что она там типа одна. А вот у матриц как раз можно посмотреть, как правое умножение не равно левому умножению, и поэтому операция умножения матриц не коммутативна, поэтому две операции умножения на множестве матриц никуда не делись, а результаты у них не равны. Соответственно, и операции бывают не только бинарные. Бинарные - это просто те, у которых n = 2, а n может быть и больше двух.
А сравнение - это вообще отношение, а не операция. Но это тоже просто бинарное отношение, у которого n = 2.
izooomrud
doza_and
Вам задали или вы сами это придумали?
Я его сам придумал. В общем, есть 3 склада с разными товарами, нужно выбрать из массива все однотипные товары имеющие отличие в их количестве между собой на заданный %. Как бы с применением mysql это не сложно сделать, но можно ли одними массивами?
doza_and
Так значительно понятнее. Все равно программная реализация невозможна из за нечеткости постановки. А уточнение затруднено тем что непонятно какие действия вы хотите предпринять. Вы выравниваете число товаров по складам?
У вас путаются реальность - склады и виртуальность - массивы.

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 будет проще. по сути там тоже самое получится.
izooomrud
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)

Конечно изначально вопрос стоял о штатной функции, которая делает подобное, но и так сойдёт
xam1816
izooomrud
А в итоге я пытаюсь получить такой словарь:

{“gear”: {0: {“stock1/stock2”, 100, 101}, 1: {“stock2/stock3”, 101, 100}}}
Непонятно как вы дальше собираетесь использовать эти данные, выглядит сложно для дальнейших операций с данными в таком виде
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB