В последнее время я много работаю с API monday.com. Как только я получаю запрошенные данные, я извлекаю определенные фрагменты, чтобы сверить их с другими значениями, манипулировать ими и т. д. Из-за сложности запроса мне часто приходится перебирать вложенные списки словарей со значениями из более вложенных списков словарей. Их довольно легко перебирать, чтобы найти именно ту информацию, которую я ищу, но я хотел бы знать, есть ли какие-то лучшие методы, чем использование списков или несколько для/if.
Давайте воспользуемся приведенным ниже примером. Цель состоит в том, чтобы найти идентификатор значения «элементов», где имя равно заголовку «группы» после второго тире (-).
Первый заголовок «группы», который соответствует, — это 2000 Foo Bar: Mapping. Это вернет идентификатор 1234564130.
Второй заголовок «группы» — «Компьютер 2023». Это вернет идентификатор 1234564074.
И так далее, и так далее.
Приведенный ниже код работает и достаточно быстр для моей текущей ситуации, но я знаю, что использование циклов double for может стать довольно медленным (O(n²)). И у меня есть 5 вложенных циклов for. Есть ли способ получить эту конкретную информацию более эффективным способом с точки зрения временной сложности или, по крайней мере, без такого количества вложенных циклов 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')
Подробнее здесь: https://stackoverflow.com/questions/775 ... ated-neste
Сбор данных из вложенных списков и словарей без использования повторяющихся вложенных операторов for/if. ⇐ Python
Программы на Python
1762794604
Anonymous
В последнее время я много работаю с API monday.com. Как только я получаю запрошенные данные, я извлекаю определенные фрагменты, чтобы сверить их с другими значениями, манипулировать ими и т. д. Из-за сложности запроса мне часто приходится перебирать вложенные списки словарей со значениями из более вложенных списков словарей. Их довольно легко перебирать, чтобы найти именно ту информацию, которую я ищу, но я хотел бы знать, есть ли какие-то лучшие методы, чем использование списков или несколько для/if.
Давайте воспользуемся приведенным ниже примером. Цель состоит в том, чтобы найти идентификатор значения «элементов», где имя равно заголовку «группы» после второго тире (-).
Первый заголовок «группы», который соответствует, — это 2000 Foo Bar: Mapping. Это вернет идентификатор 1234564130.
Второй заголовок «группы» — «Компьютер 2023». Это вернет идентификатор 1234564074.
И так далее, и так далее.
Приведенный ниже код работает и достаточно быстр для моей текущей ситуации, но я знаю, что использование циклов double for может стать довольно медленным (O(n²)). И у меня есть 5 вложенных циклов for. Есть ли способ получить эту конкретную информацию более эффективным способом с точки зрения временной сложности или, по крайней мере, без такого количества вложенных циклов 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')
Подробнее здесь: [url]https://stackoverflow.com/questions/77532463/collecting-data-from-nested-lists-and-dictionaries-without-using-repeated-neste[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия