Найти - Пользователи
Полная версия: Добавление в словарь. Как автоматически менять названия ключей при добавлении в словарь, если данные ключи уже существуют?
Начало » Python для новичков » Добавление в словарь. Как автоматически менять названия ключей при добавлении в словарь, если данные ключи уже существуют?
1 2
Nagibajupython69
Создала пустой словарь в который добавляю ключ-значения из цикла 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
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
Я как раз использовала defaultdict и .append. Извините, что немного криво выглядит код, скопировался без отступов. Я думала, если это можно как-то обойти. При использовании обычного словаря у меня выводится таблица в правильном формате, только отсутсвуют значения из-за ключей, которые повторяются. При использовании метода, как я описала и ваше описание у меня DataFrame заполняется одинаковыми строками. И все полученные словари, которые должны соответствовать: один словарь после трансформации=одна строка DataFrame, все эти словари соединились по столбцам и у меня выходит так,что DataFrame состоит из одинаковой строки, которая повторяется столько раз, сколько должно быть столбцов. Ну а в столбце соединились значения всех словарей, а также ключей, которые повторялись.

Я либо не там объявила переменную a=defaultdict(list), либо неправильно объявила, либо возвращаю не то значение функции. И даже не особо понимаю как это реально решить. Просто сижу и пробую одно поменять и посмотреть, если что-то изменится, другое поменять.

Буду безумно благодарна если подскажете статьи или как гуглить относительно переменных. Например зачем возвращать не значение, а его копию

doza_and
Nagibajupython69
Я думала, если это можно как-то обойти.
Обходить надо если оно мешает.

Nagibajupython69
При использовании обычного словаря у меня выводится таблица в правильном формате
Я думаю вам надо написать что именно вы хотите делать с вашими данными.
Если коротко, то

словарь это хранилище в котором ключи НЕ ПОВТОРЯЮТСЯ. И сувать туда повторяющиеся ключи не следует если вам нужны все данные.

Аналогом таблицы является список списков. Его и используйте в этом случае.

 [
["key1",1],
["key1",2],
["key3",1],
]

Это может вызвать определенные проблемы. Но их мы обсудим если вы о них хоть чтото напишете.
xam1816
чего тем одинаковых наплодили,объедините тогда, а то я как в паралельном мире пишу
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
У меня на входе данные формата JSON и в этом сложность, так как данные берутся по URL запросу и могут содержать много вложеннных словарей, повторяющиеся названия столбцов. И как раз URL запросы нужно перевести в формат Dataframe, где ключи - названия столбцов
xam1816
пришли пример json сюда
Nagibajupython69
Спасибо большое, попробую сейчас реализовать. Я в теме Python полторы недели и то, что хочется написать логически не всегда получается, потому что моя логика не аналогична логике Python, а значит я не очень логична) Чувствую себя блондинистым наказанием. defaultdict хорошо работает для одного случая, но у меня на входе много словарей - то есть будущих строк DataFrame. Ответ где-то очень близко, а решение скорее в возвращаемом значении или в объявлении
Nagibajupython69
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
Вот этот код отвечает трем строкам DataFrame
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB