@ru_python

Страница 2386 из 9768
Gnobitel
03.03.2017
00:50:14
обойти

но после того как преобразуешь через loads, они имеют другие расположения в словаре

Походу придется каждый ключ проверять на все возможные варианты

Это так-то как-то не очень

Google
Gnobitel
03.03.2017
00:54:11
json-поля обходишь и переименовываешь
не переименовываешь а создаешь новый контейнер, т.к. dict is immutable

точнее ключи immutable

Gnobitel
03.03.2017
01:08:15
OrderedDict?
нет смысла, я хотел индекс обхода по каждому словарю привзать к определенному унифицированному полю, но для каждого api индекс будет разный

короче для каждого поля создавать только листы со всеми возможными вариантами ключа и сверять

Короче, покажу на адекватном примере что надо

[ { "orderID": "32342302010102", "total": "9.99", "last_4": "1111", "description": "Services rendered" } ]

раз api

[ { "id": "42d213d2-cdc2-4655-99ec-9335b91c9a8f", "amount": "20.99", "last_4": "1111", "memo": "For the bill" } ]

два api

надо чтобы на выходе у обоих были одинаковые наименования ключей

Софи
03.03.2017
01:16:18
из двух сделать один?

проверяем ключи. пересоздаем нужные. удаляем старые ненужные. профит?

Google
Gnobitel
03.03.2017
01:18:56
дело то не в этом, дело в том что каждый ключ всеравно придется обходить, кол-во api может быть больше, как и выборка может состоять более чем из одной записи в листе

Софи
03.03.2017
01:19:22
а еще есть интересный метод dict.fromkeys

обходить, выдирать ключи. экстрасенсорно не узнать, что вот тута и вот здеся надо заменить ключ

ибо мы не знаем что там вообще лежит

можно лишь подумать и оптимизировать. чтобы не полный тупой перебор был

ну и вопрос нагрузки/объема данных. а то так до байтоебства можно дойти. ибо медленно

Gnobitel
03.03.2017
01:21:25
просто придется создавать 4 листа для id, total, last_4 и details со всеми вариантами наименований ключей

а потом обходить и проверять в каком содержится

Софи
03.03.2017
01:22:06
так. надо свести много апи в один или наоборот?

Gnobitel
03.03.2017
01:22:17
да много апи в один

Софи
03.03.2017
01:23:07
создать список или словарик с заменами

обойти

Gnobitel
03.03.2017
01:23:14
ну например поле id. Создаешь лист ids = ["orderID","id"]

Софи
03.03.2017
01:23:44
только учитывай. там число. а там строка с GUID

Gnobitel
03.03.2017
01:24:39
если из этого листа совпал ключ, то создаешь в новой структуре ключ с унифицированным имнем для id/ Значения мне вообще не надо трогать

Софи
03.03.2017
01:25:09
вроде бы все примитивно. по крайней мере для простого перебора

можно посмотреть методы для dict

есть items()

keys()

Google
Софи
03.03.2017
01:25:39
и прочие няшки

Gnobitel
03.03.2017
01:26:05
универсальности это не даст

Софи
03.03.2017
01:26:18
в каком смысле?

все-равно он не телепат и будет пологаться на словарь замен

Gnobitel
03.03.2017
01:27:27
в таком, что с появлением нового api, придется добавлять в листы новые возможные наименования в ручную

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

Софи
03.03.2017
01:28:05
ну тут или цепляться за что-то. где-то прививать логику. можно и нейронную сеть, лол

а еще есть макаки

зачем делать супер-пупер распознаватель капчи, если в африке полно голодающих детей? (:

в таком случае надо ставить вопрос: как сделать так, чтобы оно само додумывалось как надо заменить

вообще как-то пахнет платежным шлюзом

Gnobitel
03.03.2017
02:14:26
А от чего зависит порядок расположения элементов в словаре? от сгенерированного хэша?

Софи
03.03.2017
02:15:55
точно не стоит полагаться на это

или OrderedDict, или последние версии python, где вроде dict - упорядоченный

Gnobitel
03.03.2017
02:16:23
или OrderedDict, или последние версии python, где вроде dict - упорядоченный
В этом нет смысла, нахрена мне их сортировать

Причем каждый объект JSON

Софи
03.03.2017
02:17:30
просто в чем дело. dict - это словарь. key-value хранилище

Gnobitel
03.03.2017
02:17:31
Да и плюс разные наименования клбчей

Google
Софи
03.03.2017
02:17:40
задачи порядка там базово не стоят

https://habrahabr.ru/post/247843/

Gnobitel
03.03.2017
02:21:30
https://habrahabr.ru/post/247843/
Как ты думаешь как реализовано сохранение порядка?

Софи
03.03.2017
02:21:59
Вернёмся к процедуре добавления элемента в словарь. После успешного добавления или обновления записи в хэш-таблице происходит сравнение следующей записи-кандидата на вставку. Если хэш или ключ у записей не совпадают, начинается пробирование. Происходит поиск «неиспользованной» ячейки для вставки. В данной реализации Python используется случайное (а если переменная perturb равна нулю – квадратичное) пробирование. Как было описано выше, при случайном пробировании индекс следующей ячейки выбирается псевдослучайным образом. Запись добавляется в первую найденную «неиспользованную» ячейку. То есть два ключа a и b, у которых hash(a) == hash(b), но a != b могут легко существовать в одном словаре. В случае если ячейка по начальному индексу пробы «пустая», произойдёт пробирование. И если первая найденная ячейка будет «нулевая», то «пустая» ячейка будет использована заново. Это позволяет перезаписать удалённые ячейки, сохраняя ещё неиспользованные. Получается, что индексы добавляемых в словарь элементов зависят от уже находящихся в нём элементов, и порядок ключей для двух словарей, состоящих из одного и того же набора пар (ключ, значение), может быть разным и определяется очерёдностью добавления элементов:

Gnobitel
03.03.2017
02:22:22
Я фигею, мне с опытом в c++ 5 лет рассказывают, про контейнеры и как они реализованы)))

Софи
03.03.2017
02:23:37
откуда я знаю у кого какой опыт?

и почему человек с 5 летним опытом спрашивает как пропатчить json массив?

Admin
ERROR: S client not available

Gnobitel
03.03.2017
02:24:47
и почему человек с 5 летним опытом спрашивает как пропатчить json массив?
Потому что задача не тривиальна, если реализовывать универсально, плюс на питоне)

Пропатчить... Это называется merge или combine с unified keys

@aragaer единственный кто мне здесь что-то годное советовал :( что ж такое. Так понимаю еще спит.

Pavel
03.03.2017
02:53:27
Потому что задача не тривиальна, если реализовывать универсально, плюс на питоне)
Не вижу ничего сложного. Набор функций, проверяющих принадлежность словаря к версии, и возвращаются унифицированные дикт или none. И код вида [list(filter(None, f(d) for f in funclist)) for d in dictlist].

Pavel
03.03.2017
03:00:08
Либо я не понимаю, либо я так задачу объяснил плохо:(
Доберусь до работы, покажу кусок кода

Petr
03.03.2017
03:00:17


Gnobitel
03.03.2017
03:00:22
Petr
03.03.2017
03:00:27
надо таких наклеек наделать

Pavel
03.03.2017
03:08:10
Кого останавливал пипи от перехода на третий питон? Смотрите, что в мире творится.

PyPy Development: Async HTTP benchmarks on PyPy3 http://feedproxy.google.com/~r/PyPyStatusBlog/~3/tCdUWmN4ppk/async-http-benchmarks-on-pypy3.html PyPy научился работать с asyncio

Gnobitel
03.03.2017
03:18:26
Доберусь до работы, покажу кусок кода
Ну я вот в лоб сделал, вот так

Google
Gnobitel
03.03.2017
03:20:28
блин что-то bold подвисает) минутку

def unifies_api(urls): payment_id = ["id", "orderID"] total = ["amount"] last_4 = [] details = ["memo", "description"] unified_api = []

for url in urls: j = json.loads(requests(url).text) for d in j: for key in d: if key in payment_id: d["remote_payment_id"] = d.pop(key) elif key in total: d["total"] = d.pop(key) elif key in last_4: d["last_4"] = d.pop(key) elif key in details: d["details"] = d.pop(key) unified_api = unified_api + j return json.dumps(unified_api)

Извиняюсь, что-то целиком не хочет брать код bold

Dan
03.03.2017
03:26:38
json.loads(requests(url).text) -> requests(url).json()

Gnobitel
03.03.2017
03:28:59
json.loads(requests(url).text) -> requests(url).json()
это мелочь, но да) спасибо

Dan
03.03.2017
03:29:34
это мелочь, но да) спасибо
я еще не проснулся =) что не работает ?

Gnobitel
03.03.2017
03:30:56
я еще не проснулся =) что не работает ?
работает. Дело в другом, хочется что-то более универсальное при увеличении количества api и без добавления в ручную новых наименований в листы payment_id, total, last_4, details

Но мне кажется так не получится

это мелочь, но да) спасибо
у меня вроде кстати правильнее) но да ладно

Dan
03.03.2017
03:34:28
ну как вариант сделать payment_id, total, last_4, details не отдельными переменными а словарем

Gnobitel
03.03.2017
03:36:55
ну как вариант сделать payment_id, total, last_4, details не отдельными переменными а словарем
это не меняет дела. перед тем как делать слияние с новым api придется добавить новые наименования keys вручную, если они отличаются от прошлых версий api. Собственно это все для того чтобы сделать слияние нескольких api с унифицированными ключами

Dan
03.03.2017
03:40:07
правильно ли я понял что должнобыть что то вроде x = {'a': 1, 'b': 2} y = {'b': 3, 'c': 4} {'a': 1, 'b': 3, 'c': 4}

Dan
03.03.2017
03:40:46
тогда показывай входные данные и что должно быть на выходе

Gnobitel
03.03.2017
03:41:30
[ { "orderID": "32342302010102", "total": "9.99", "last_4": "1111", "description": "Services rendered" } ]

[ { "id": "42d213d2-cdc2-4655-99ec-9335b91c9a8f", "amount": "20.99", "last_4": "1111", "memo": "For the bill" } ]

Это входные

Pavel
03.03.2017
03:41:38
https://gist.github.com/anonymous/3fe461daa20d24ea960411b6e9db66f2

Страница 2386 из 9768