Форум сайта python.su
Создала пустой словарь в который добавляю ключ-значения из цикла for, необходимо сохранить все из цикла.
Подскажите пожалуйста, может поставить условие на существование ключа в словаре и придумать автоматическое генерирование названия нового ключа, если ключ уже существует в словаре.
Например у меня подается на входе:
'name': ‘NSU’
'Location': ‘Novosibirsk’
'name': ‘Alexander Ivanov’
'Aim': ‘Student’
'name': ‘MMF’
Хочу на выходе получить словарь:
{'name': ‘NSU’,'Location': ‘Novosibirsk’, ‘name_1’: ‘Alexander Ivanov’, ‘Aim’: ‘Student’, ‘name_2’: ‘MMF’}
У меня на входе список элементы которого словари. Я каждый элемент списка (словарь с вложенными словарями) преобразую как раз до простого словаря (нахожу конечные ключ-значения с помощью рекурсии), в процессе раскрытия словарей у меня и появляются одинаковые ключи. На выходе хотела бы получить список состоящий из простых словарей с сохраненнием всех ключей и преобразовать список словарей до DF. Проблема словаря - в том,что если у меня 3 раза например появляется ключ name - сохраняется лишь последнее значение, но я бы хотела получить три разные ключа.
Буду очень благодарна любой помощи)
Отредактировано Nagibajupython69 (Март 3, 2021 00:52:41)
Офлайн
Nagibajupython69Это не проблема словаря. Проблема в том что вы не можете выразить то что хотите в виде нужных структур данных.
Проблема словаря - в том,что если у меня 3 раза например появляется ключ
from collections import defaultdict dd=defaultdict(list) some= [["key1",1],["key1",2]] for k,v in some: dd[k].append(v) dd {"key1":[1,2]}
dd["key1_1"]=1 # ваш вариант dd["key1"][1]=1 # предложенный вариант
Отредактировано doza_and (Март 2, 2021 20:14:17)
Офлайн
Я как раз использовала defaultdict и .append. Извините, что немного криво выглядит код, скопировался без отступов. Я думала, если это можно как-то обойти. При использовании обычного словаря у меня выводится таблица в правильном формате, только отсутсвуют значения из-за ключей, которые повторяются. При использовании метода, как я описала и ваше описание у меня DataFrame заполняется одинаковыми строками. И все полученные словари, которые должны соответствовать: один словарь после трансформации=одна строка DataFrame, все эти словари соединились по столбцам и у меня выходит так,что DataFrame состоит из одинаковой строки, которая повторяется столько раз, сколько должно быть столбцов. Ну а в столбце соединились значения всех словарей, а также ключей, которые повторялись.
Я либо не там объявила переменную a=defaultdict(list), либо неправильно объявила, либо возвращаю не то значение функции. И даже не особо понимаю как это реально решить. Просто сижу и пробую одно поменять и посмотреть, если что-то изменится, другое поменять.
Буду безумно благодарна если подскажете статьи или как гуглить относительно переменных. Например зачем возвращать не значение, а его копию
Офлайн
Nagibajupython69Обходить надо если оно мешает.
Я думала, если это можно как-то обойти.
Nagibajupython69Я думаю вам надо написать что именно вы хотите делать с вашими данными.
При использовании обычного словаря у меня выводится таблица в правильном формате
[ ["key1",1], ["key1",2], ["key3",1], ]
Офлайн
чего тем одинаковых наплодили,объедините тогда, а то я как в паралельном мире пишу
Nagibajupython69я бы задумался,на сколько удобна такая структура данных,на сколько удобно ей будет пользоваться при больших объемах.А так это похоже на выборку из таблиц базы данных,которую надо отправить куда-то одним запросом.ТОгда ключем я бы использовал название таблицы,а значением словарь из названия столбцов и их значения.К примеру
Хочу на выходе получить словарь:
{'name': ‘NSU’,'Location': ‘Novosibirsk’, ‘name_1’: ‘Alexander Ivanov’, ‘Aim’: ‘Student’, ‘name_2’: ‘MMF’}
d= { 'table_name_1': { 'name': 'NSU', 'Location': 'Novosibirsk' }, 'table_name_2': { 'name': 'Alexandr Ivanov', 'Aim': 'Student', }, 'table_name_3': { 'name': "MMF" } } for i in d.keys(): print(d[i]['name'])
NSU Alexandr Ivanov MMF Process finished with exit code 0
Отредактировано xam1816 (Март 2, 2021 22:02:42)
Офлайн
У меня на входе данные формата JSON и в этом сложность, так как данные берутся по URL запросу и могут содержать много вложеннных словарей, повторяющиеся названия столбцов. И как раз URL запросы нужно перевести в формат Dataframe, где ключи - названия столбцов
Офлайн
пришли пример json сюда
Офлайн
Спасибо большое, попробую сейчас реализовать. Я в теме Python полторы недели и то, что хочется написать логически не всегда получается, потому что моя логика не аналогична логике Python, а значит я не очень логична) Чувствую себя блондинистым наказанием. defaultdict хорошо работает для одного случая, но у меня на входе много словарей - то есть будущих строк DataFrame. Ответ где-то очень близко, а решение скорее в возвращаемом значении или в объявлении
Офлайн
user=“”“
{
”totalSize“: 3,
”done“: true,
”records“: [
{
”attributes“: {
”type“: ”Opportunity“,
”url“: ”/services/data/v46.0/sobjects/Opportunity/4747jdgfjd“
},
”Id“: ”0064I00000qtnCHQAY“,
”Name“: ”Excel“,
”Opportunity_Lead__r“: {
”attributes“: {
”type“: ”User“,
”url“: ”/services/data/v46.0/sobjects/User/dhd6439“
},
”Name“: ”Adam Bojar“
},
”Opportunity_Lead__c“: ”fhd76570dj“,
”CreatedDate“: ”2019-04-05T07:14:13.000+0000“,
”Delivery_Start_Date__c“: ”2019-04-05“,
”Delivery_End_Date__c“: ”2019-04-30“,
”Amount“: 3000.0,
”StageName“: ”Won“,
”CloseDate“: ”2019-04-05“,
”Opportunity_Owner__c“: ”Milana Navarova“,
”Owner“: {
”attributes“: {
”type“: ”User“,
”url“: ”/services/data/v46.0/sobjects/User/00558000001YakkAAC“
},
”Cost_Centre_Code__c“: ”4657djjd“
},
”OpportunityLineItems“: {
”totalSize“: 1,
”done“: true,
”records“: [
{
”attributes“: {
”type“: ”OpportunityLineItem“,
”url“: ”/services/data/v46.0/sobjects/OpportunityLineItem/djdkt78e“
},
”ProductCode“: ”47470d“
}
]
}
},
{
”attributes“: {
”type“: ”Opportunity“,
”url“: ”/services/data/v46.0/sobjects/Opportunity/0064I00000tJWlzQAG“
},
”Id“: ”fhjdjds947“,
”Name“: ”Shell“,
”Opportunity_Lead__r“: {
”attributes“: {
”type“: ”User“,
”url“: ”/services/data/v46.0/sobjects/User/djds9r97“
},
”Name“: ”Anna Pavlova“
},
”Opportunity_Lead__c“: ”jfdj566478“,
”CreatedDate“: ”2019-06-11T15:11:17.000+0000“,
”Delivery_Start_Date__c“: ”2019-11-01“,
”Delivery_End_Date__c“: ”2020-03-31“,
”Amount“: 50000.0,
”StageName“: ”Won“,
”CloseDate“: ”2020-03-27“,
”Opportunity_Owner__c“: ”Petr Petrov“,
”Owner“: {
”attributes“: {
”type“: ”User“,
”url“: ”/services/data/v46.0/sobjects/User/56576EJCSHSJ“
},
”Cost_Centre_Code__c“: ”ASJF“
},
”OpportunityLineItems“: {
”totalSize“: 1,
”done“: true,
”records“: [
{
”attributes“: {
”type“: ”OpportunityLineItem“,
”url“: ”/services/data/v46.0/sobjects/OpportunityLineItem/djdj7564jdh“
},
”ProductCode“: ”fdhdysl“
}
]
}
},
{
”attributes“: {
”type“: ”Opportunity“,
”url“: ”/services/data/v46.0/sobjects/Opportunity/fhdjs856“
},
”Id“: ”564hhdjsk84“,
”Name“: ”Auto BMW“,
”Opportunity_Lead__r“: {
”attributes“: {
”type“: ”User“,
”url“: ”/services/data/v46.0/sobjects/User/hfhdgs47“
},
”Name“: ”Vladimir Kan“
},
”Opportunity_Lead__c“: ”Alex Muler“,
”CreatedDate“: ”2019-09-19T11:52:47.000+0000“,
”Delivery_Start_Date__c“: ”2019-10-07“,
”Delivery_End_Date__c“: ”2020-08-31“,
”Amount“: 120.0,
”StageName“: ”Won“,
”CloseDate“: ”2020-01-27“,
”Opportunity_Owner__c“: ”Anrej Ivanov“,
”Owner“: {
”attributes“: {
”type“: ”User“,
”url“: ”/services/data/v46.0/sobjects/User/00558000002HqLfAAK“
},
”Cost_Centre_Code__c“: ”FJDH“
},
”OpportunityLineItems“: {
”totalSize“: 1,
”done“: true,
”records“: [
{
”attributes“: {
”type“: ”OpportunityLineItem“,
”url“: ”/services/data/v46.0/sobjects/OpportunityLineItem/FJDJSLS4557“
},
”ProductCode“: ”FGSHJ“
}
]
}
}
]
}
”“”
Офлайн
Вот этот код отвечает трем строкам DataFrame
Отредактировано Nagibajupython69 (Март 3, 2021 00:47:18)
Офлайн