Nagibajupython69
Март 2, 2021 19:35:40
Создала пустой словарь в который добавляю ключ-значения из цикла 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 - сохраняется лишь последнее значение, но я бы хотела получить три разные ключа.
Буду очень благодарна любой помощи)
doza_and
Март 2, 2021 20:10:01
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 # предложенный вариант
а в плюсах есть на это multimap…
Nagibajupython69
Март 2, 2021 21:31:10
Я как раз использовала defaultdict и .append. Извините, что немного криво выглядит код, скопировался без отступов. Я думала, если это можно как-то обойти. При использовании обычного словаря у меня выводится таблица в правильном формате, только отсутсвуют значения из-за ключей, которые повторяются. При использовании метода, как я описала и ваше описание у меня DataFrame заполняется одинаковыми строками. И все полученные словари, которые должны соответствовать: один словарь после трансформации=одна строка DataFrame, все эти словари соединились по столбцам и у меня выходит так,что DataFrame состоит из одинаковой строки, которая повторяется столько раз, сколько должно быть столбцов. Ну а в столбце соединились значения всех словарей, а также ключей, которые повторялись.
Я либо не там объявила переменную a=defaultdict(list), либо неправильно объявила, либо возвращаю не то значение функции. И даже не особо понимаю как это реально решить. Просто сижу и пробую одно поменять и посмотреть, если что-то изменится, другое поменять.
Буду безумно благодарна если подскажете статьи или как гуглить относительно переменных. Например зачем возвращать не значение, а его копию
doza_and
Март 2, 2021 21:57:30
Nagibajupython69
Я думала, если это можно как-то обойти.
Обходить надо если оно мешает.
Nagibajupython69
При использовании обычного словаря у меня выводится таблица в правильном формате
Я думаю вам надо написать что именно вы хотите делать с вашими данными.
Если коротко, то
словарь это хранилище в котором ключи НЕ ПОВТОРЯЮТСЯ. И сувать туда повторяющиеся ключи не следует если вам нужны все данные.
Аналогом таблицы является список списков. Его и используйте в этом случае.
[
["key1",1],
["key1",2],
["key3",1],
]
Это может вызвать определенные проблемы. Но их мы обсудим если вы о них хоть чтото напишете.
xam1816
Март 2, 2021 22:01:13
чего тем одинаковых наплодили,объедините тогда, а то я как в паралельном мире пишу
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
Nagibajupython69
Март 2, 2021 22:09:35
У меня на входе данные формата JSON и в этом сложность, так как данные берутся по URL запросу и могут содержать много вложеннных словарей, повторяющиеся названия столбцов. И как раз URL запросы нужно перевести в формат Dataframe, где ключи - названия столбцов
Nagibajupython69
Март 2, 2021 22:14:28
Спасибо большое, попробую сейчас реализовать. Я в теме Python полторы недели и то, что хочется написать логически не всегда получается, потому что моя логика не аналогична логике Python, а значит я не очень логична) Чувствую себя блондинистым наказанием. defaultdict хорошо работает для одного случая, но у меня на входе много словарей - то есть будущих строк DataFrame. Ответ где-то очень близко, а решение скорее в возвращаемом значении или в объявлении
Nagibajupython69
Март 2, 2021 22:19:14
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“
}
]
}
}
]
}
”“”
Nagibajupython69
Март 2, 2021 22:20:03
Вот этот код отвечает трем строкам DataFrame