Найти - Пользователи
Полная версия: Добавление в словарь. Как автоматически менять названия ключей при добавлении в словарь, если данные ключи уже существуют?
Начало » Python для новичков » Добавление в словарь. Как автоматически менять названия ключей при добавлении в словарь, если данные ключи уже существуют?
1 2
xam1816
там рядом со смайлом в редакторе сообщений,есть список тегов,выбираешь Python вставляешь,так код будет на форуме выглядеть как надо
xam1816
Json на форум отправь как выше написал, если так просто вставляешь,там кавычки какие-то винтажные получаются,в редакторе у меня такие не прокатывают,долго править
Nagibajupython69
Это переменная по типу строка. Это то,что я скопировала из Postman при получении GET запроса.
Там если написать: data=json.loads(user), то будет отображаться как список из 3х элементов, каждый элемент которого это словарь в котором словари.
Спасибо большое за помощь


 user="""
{
    "totalSize": 3,
    "done": true,
    "records": [
        {
            "attributes": {
                "type": "Opportunity",
                "url": "0064I00000qtnhjdujdjds98"
            },
            "Id": "774ndklsk90",
            "Name": "Excel",
            "Opportunity_Lead__r": {
                "attributes": {
                    "type": "User",
                    "url": "fjdjdnxfdjf7r038"
                },
                "Name": "Vladimir Ivanov"
            },
            "Opportunity_Lead__c": "747fhdkdk",
            "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": "Petr Amir",
            "Owner": {
                "attributes": {
                    "type": "User",
                    "url": "fhf87eedjsfhd6400037fh"
                },
                "Cost_Centre_Code__c": "FGHKD"
            },
            "OpportunityLineItems": {
                "totalSize": 1,
                "done": true,
                "records": [
                    {
                        "attributes": {
                            "type": "OpportunityLineItem",
                            "url": "fhfhdydlsms5749djx"
                        },
                        "ProductCode": "TYDL0"
                    }
                ]
            }
        },
        {
            "attributes": {
                "type": "Opportunity",
                "url": "t7hhdlksfuFJDUD4899"
            },
            "Id": "58FJFKD",
            "Name": "Shell",
            "Opportunity_Lead__r": {
                "attributes": {
                    "type": "User",
                    "url": "jjddjd857dh5758FJFDJ"
                },
                "Name": "Vladimir Sytov"
            },
            "Opportunity_Lead__c": "8r8rjfdkdkdb",
            "CreatedDate": "2019-06-11T15:11:17.000+0000",
            "Delivery_Start_Date__c": "2019-11-01",
            "Delivery_End_Date__c": "2020-03-31",
            "Amount": 500.0,
            "StageName": "Won",
            "CloseDate": "2020-03-27",
            "Opportunity_Owner__c": "Kiril Alexeev",
            "Owner": {
                "attributes": {
                    "type": "User",
                    "url": "fjd7574kdjd00047dhsk"
                },
                "Cost_Centre_Code__c": "HGFL"
            },
            "OpportunityLineItems": {
                "totalSize": 1,
                "done": true,
                "records": [
                    {
                        "attributes": {
                            "type": "OpportunityLineItem",
                            "url": "jf84hd00k4I00001q91OhQAI"
                        },
                        "ProductCode": "JFKD"
                    }
                ]
            }
        },
        {
            "attributes": {
                "type": "Opportunity",
                "url": "575fjdlks599RFJJDH"
            },
            "Id": "85JFKD0",
            "Name": "BMW",
            "Opportunity_Lead__r": {
                "attributes": {
                    "type": "User",
                    "url": "gfhf7re99RJFDD7DMKS"
                },
                "Name": "Andrey Buglak"
            },
            "Opportunity_Lead__c": "858jfhdgsk",
            "CreatedDate": "2019-09-19T11:52:47.000+0000",
            "Delivery_Start_Date__c": "2019-10-07",
            "Delivery_End_Date__c": "2020-08-31",
            "Amount": 1200.0,
            "StageName": "Won",
            "CloseDate": "2020-01-27",
            "Opportunity_Owner__c": "Anna Karpenko",
            "Owner": {
                "attributes": {
                    "type": "User",
                    "url": "gu7r903jd588fdhk0d"
                },
                "Cost_Centre_Code__c": "JGFDL"
            },
            "OpportunityLineItems": {
                "totalSize": 1,
                "done": true,
                "records": [
                    {
                        "attributes": {
                            "type": "OpportunityLineItem",
                            "url": "757hfkd0s00k4I00001spr"
                        },
                        "ProductCode": "P043"
                    }
                ]
            }
        }
    ]
}
"""
Nagibajupython69
Точнее я погружаюсь на уровень ‘records’ -> и оттуда иду по элементам раскрывать)
xam1816
 import json
user="""
{
    "totalSize": 3,
    "done": true,
    "records": [
        {
            "attributes": {
                "type": "Opportunity",
                "url": "/services/data/v46.0/sobjects/Opportunity/0064I00000qtnCHQAY"
            },
            "Id": "0064I00000qtnCHQAY",
            "Name": "Excel",
            "Opportunity_Lead__r": {
                "attributes": {
                    "type": "User",
                    "url": "/services/data/v46.0/sobjects/User/fdjf7r038"
                },
                "Name": "Vladimír Ivanov"
            },
            "Opportunity_Lead__c": "747fhdkdk",
            "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": "Petr Amir",
            "Owner": {
                "attributes": {
                    "type": "User",
                    "url": "/services/data/v46.0/sobjects/User/fhd6400037fh"
                },
                "Cost_Centre_Code__c": "FGHKD"
            },
            "OpportunityLineItems": {
                "totalSize": 1,
                "done": true,
                "records": [
                    {
                        "attributes": {
                            "type": "OpportunityLineItem",
                            "url": "/services/data/v46.0/sobjects/OpportunityLineItem/00k4I00001k7uxfQAA"
                        },
                        "ProductCode": "TYDL0"
                    }
                ]
            }
        },
        {
            "attributes": {
                "type": "Opportunity",
                "url": "/services/data/v46.0/sobjects/Opportunity/FJDUD4899"
            },
            "Id": "58FJFKD",
            "Name": "Shell Data Governance",
            "Opportunity_Lead__r": {
                "attributes": {
                    "type": "User",
                    "url": "/services/data/v46.0/sobjects/User/5758FJFDJ"
                },
                "Name": "Vladimir Sytov"
            },
            "Opportunity_Lead__c": "8r8rjfdkdkdb",
            "CreatedDate": "2019-06-11T15:11:17.000+0000",
            "Delivery_Start_Date__c": "2019-11-01",
            "Delivery_End_Date__c": "2020-03-31",
            "Amount": 500.0,
            "StageName": "Won",
            "CloseDate": "2020-03-27",
            "Opportunity_Owner__c": "Kiril Alexeev",
            "Owner": {
                "attributes": {
                    "type": "User",
                    "url": "/services/data/v46.0/sobjects/User/00047dhsk"
                },
                "Cost_Centre_Code__c": "HGFL"
            },
            "OpportunityLineItems": {
                "totalSize": 1,
                "done": true,
                "records": [
                    {
                        "attributes": {
                            "type": "OpportunityLineItem",
                            "url": "/services/data/v46.0/sobjects/OpportunityLineItem/00k4I00001q91OhQAI"
                        },
                        "ProductCode": "JFKD"
                    }
                ]
            }
        },
        {
            "attributes": {
                "type": "Opportunity",
                "url": "/services/data/v46.0/sobjects/Opportunity/599RFJJDH"
            },
            "Id": "85JFKD0",
            "Name": "BMW",
            "Opportunity_Lead__r": {
                "attributes": {
                    "type": "User",
                    "url": "/services/data/v46.0/sobjects/User/99RJFDD7DMKS"
                },
                "Name": "Andrey Buglak"
            },
            "Opportunity_Lead__c": "858jfhdgsk",
            "CreatedDate": "2019-09-19T11:52:47.000+0000",
            "Delivery_Start_Date__c": "2019-10-07",
            "Delivery_End_Date__c": "2020-08-31",
            "Amount": 1200.0,
            "StageName": "Won",
            "CloseDate": "2020-01-27",
            "Opportunity_Owner__c": "Anna Karpenko",
            "Owner": {
                "attributes": {
                    "type": "User",
                    "url": "/services/data/v46.0/sobjects/User/588fdhk0d"
                },
                "Cost_Centre_Code__c": "JGFDL"
            },
            "OpportunityLineItems": {
                "totalSize": 1,
                "done": true,
                "records": [
                    {
                        "attributes": {
                            "type": "OpportunityLineItem",
                            "url": "/services/data/v46.0/sobjects/OpportunityLineItem/00k4I00001spr"
                        },
                        "ProductCode": "P043"
                    }
                ]
            }
        }
    ]
}
"""
data = json.loads(user)
rec = data['records'][0]
def f(rec):
	new = {}
	for k, v in rec.items():
		if isinstance(v, dict):
			for k1, v1 in v.items():
				if isinstance(v1, dict) and k != k1:
					for k2, v2 in v.items():
						if isinstance(v2, dict) and k1 != k2:
							for k3, v3 in v.items():
								new[f'{k}_{k1}_{k2}_{k3}'] = v3
						else:
							new[f'{k}_{k1}_{k2}'] = v2
				else:
					new[f'{k}_{k1}'] = v1
		else:
			new[f'{k}']=v
	return new
for k,v in f(rec).items():
	print(f'{k}: {v}')
вывод
 attributes_type: Opportunity
attributes_url: /services/data/v46.0/sobjects/Opportunity/0064I00000qtnCHQAY
Id: 0064I00000qtnCHQAY
Name: Excel
Opportunity_Lead__r_attributes_attributes: {'type': 'User', 'url': '/services/data/v46.0/sobjects/User/fdjf7r038'}
Opportunity_Lead__r_attributes_Name: Vladimír Ivanov
Opportunity_Lead__r_Name: Vladimír Ivanov
Opportunity_Lead__c: 747fhdkdk
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: Petr Amir
Owner_attributes_attributes: {'type': 'User', 'url': '/services/data/v46.0/sobjects/User/fhd6400037fh'}
Owner_attributes_Cost_Centre_Code__c: FGHKD
Owner_Cost_Centre_Code__c: FGHKD
OpportunityLineItems_totalSize: 1
OpportunityLineItems_done: True
OpportunityLineItems_records: [{'attributes': {'type': 'OpportunityLineItem', 'url': '/services/data/v46.0/sobjects/OpportunityLineItem/00k4I00001k7uxfQAA'}, 'ProductCode': 'TYDL0'}]
Process finished with exit code 0

примерно вот так,только доделать для остальных вложенных словарей,новым ключем сделать ‘ключ_вложенныйключ’, так связь не потеряется с данными,идея думаю понятна


xam1816
вот так подойдет?
 data = json.loads(user)
rec = data['records'][0]
new = {}
def decompose(data, new):
	for k in data:
		if isinstance(data[k], dict):
			new.update(decompose(data[k], new))
		elif isinstance(data[k], list):
			for i in data[k]:
				new.update(decompose(i,new))
		else:
			value = data[k]
			while True:
				if k in new:
					k = f'*{k}'
				else:
					new[k] = value
					break
	return new
for k, v in rec.items():
	print(f'{k}: {v}')
print('==============')
new = decompose(rec,new)
for k, v in new.items():
	print(f'{k}: {v}')

 attributes: {'type': 'Opportunity', 'url': '/services/data/v46.0/sobjects/Opportunity/0064I00000qtnCHQAY'}
Id: 0064I00000qtnCHQAY
Name: Excel
Opportunity_Lead__r: {'attributes': {'type': 'User', 'url': '/services/data/v46.0/sobjects/User/fdjf7r038'}, 'Name': 'Vladimír Ivanov'}
Opportunity_Lead__c: 747fhdkdk
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: Petr Amir
Owner: {'attributes': {'type': 'User', 'url': '/services/data/v46.0/sobjects/User/fhd6400037fh'}, 'Cost_Centre_Code__c': 'FGHKD'}
OpportunityLineItems: {'totalSize': 1, 'done': True, 'records': [{'attributes': {'type': 'OpportunityLineItem', 'url': '/services/data/v46.0/sobjects/OpportunityLineItem/00k4I00001k7uxfQAA'}, 'ProductCode': 'TYDL0'}]}
==============
type: Opportunity
url: /services/data/v46.0/sobjects/Opportunity/0064I00000qtnCHQAY
Id: 0064I00000qtnCHQAY
Name: Excel
*type: User
*url: /services/data/v46.0/sobjects/User/fdjf7r038
*Name: Vladimír Ivanov
Opportunity_Lead__c: 747fhdkdk
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: Petr Amir
**type: User
**url: /services/data/v46.0/sobjects/User/fhd6400037fh
Cost_Centre_Code__c: FGHKD
totalSize: 1
done: True
***type: OpportunityLineItem
***url: /services/data/v46.0/sobjects/OpportunityLineItem/00k4I00001k7uxfQAA
ProductCode: TYDL0
Process finished with exit code 0

Звезды нужно заменить на цифры, а то их много будет ,если выборка большая.А вообще идея слепить в один словарь не очень,данные уже теряют свою связь, т.е данные которые собираются в json вложенные словари по идее не должны меняться, поэтому любое значение всегда можно найти в определенной для нее ветке.Тебе можно самой определить какие значения из какой ветки нужны,определить словарь со своими понятными ключами и заполнить нужными значениями
Nagibajupython69
Прекрасный результат. Спасибо большое!) Все очень лаконично и красиво) Можете пожалуйста подсказать какие-то годные источники или книгу, где которая стоит внимания) Я бы хотела от основ идти и улушать свои знания, потому что их очень сильно не хватает
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