Сбор данных из вложенных списков и словарей без большого количества операторов for/if.Python

Программы на Python
Ответить
Anonymous
 Сбор данных из вложенных списков и словарей без большого количества операторов for/if.

Сообщение Anonymous »

В последнее время я много работаю с API monday.com. Как только я получаю запрошенные данные, я извлекаю определенные фрагменты, чтобы сверить их с другими значениями, манипулировать ими и т. д. Из-за сложности запроса мне часто приходится перебирать вложенные списки словарей со значениями из более вложенных списков словарей. Их довольно легко перебирать, чтобы найти именно ту информацию, которую я ищу, но я хотел бы знать, есть ли какие-то лучшие методы, чем использование списков или несколько для/if.
Давайте воспользуемся приведенным ниже примером. Цель состоит в том, чтобы найти идентификатор значения «элементов», где имя равно заголовку «группы» после второго тире (-).
Первый заголовок «группы», который соответствует, — это 2000 Foo Bar: Mapping. Это вернет идентификатор 1234564130.
Второй заголовок «группы» — «Компьютер 2023». Это вернет идентификатор 1234564074.
И так далее, и так далее.
Приведенный ниже код работает и достаточно быстр для моей текущей ситуации, но я знаю, что использование циклов double for может стать довольно медленным (O(n²)). И у меня есть 5 вложенных циклов for.... Я понимаю, что этот вопрос может быть основан на самоуверенности, но есть ли какие-нибудь лучшие методы для извлечения этой конкретной информации?
{'data': {'boards': [{'groups': [{'title': '123456-G123456.00 - 2000 Foo Bar: Mapping', 'items_page': {'cursor': None, 'items': [{'id': '1234564130', 'name': '2000 Foo Bar: Mapping'}, {'id': '1234564156', 'name': '2000.5 - 2000.5 Ground Model'}]}}, {'title': '123456-R12345.00 - Computer 2023', 'items_page': {'cursor': None, 'items': [{'id': '1234564074', 'name': 'Computer 2023'}, {'id': '1234564096', 'name': '3000.1 - 3000.1 Veggies'}]}}, {'title': '123456-T12345.00 - Dodge - Design', 'items_page': {'cursor': None, 'items': [{'id': '1234564028', 'name': 'Dodge - Design'}, {'id': '1234564048', 'name': '-'}]}}, {'title': 'Group Title', 'items_page': {'cursor': None, 'items': [{'id': '1234563996', 'name': 'Task 1'}]}}]}]}, 'account_id': 123456}

query_group_id = f"""
{{
boards (ids: {my_board_id}) {{
groups {{
title
items_page (limit: 50) {{
cursor
items {{
id
name
}}
}}
}}
}}
}}
"""
data = {'query' : query_group_id}
r = requests.post(url=apiUrl, json=data, headers=headers)
r_dict = r.json()

group_board_info = r_dict['data']['boards'][0]['groups']

# This is absoluetly disgusting
for dictionary in group_board_info:
for k,v in dictionary.items():
if k == 'title':
g_name = '-'.join(v.split('-')[2:]).lstrip() # Remove leading white space
if k == "items_page":
for k2, v2 in v.items():
if k2 == 'items':
for dictionary2 in v2:
vals_list = list(dictionary2.values())
keys_list = list(dictionary2.keys())
for idx, key in enumerate(keys_list):
if key == 'id':
if vals_list[1] == g_name:
create_subitem_for_item(vals_list[0], 'init')

Изменения:
С учетом комментариев ниже и пересмотра, вот мой новый код. Это очень легко читать, понимать и легко интегрировать с другими методами итерации. Мой коллега предложил изучить glom.
for dictionary in group_board_info:
items = dictionary['items_page']['items']
for item in items:
if '-'.join(dictionary['title'].split('-')[2:]).lstrip() == item['name']:
create_subitem_for_item(item['id'], 'init')


Подробнее здесь: https://stackoverflow.com/questions/775 ... -if-statem
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»