在Python中将字典中的键提取到另一个字典

时间:2015-03-30 06:18:44

标签: python dictionary

我有一个大的python字典。其中一个键有另一个字典作为值。我想使用值创建一个新字典,然后从原始字典中删除密钥。

是否有任何函数可以将值导出到另一个字典中?删除我知道我可以使用.pop()功能。我试过谷歌搜索但没有成功。

这是字典。我使用星星来阻止敏感信息。我需要的密钥是billing_address,它有另一个字典作为值:

{
    'shipping_cost_tax': '0.0000',
    'refunded_amount': '0.0000',
    'external_source': None,
    'discount_amount': '0.0000',
    'base_wrapping_cost': '0.0000',
    'shipping_cost_tax_class_id': 2,
    'payment_method': 'PayPal',
    'handling_cost_ex_tax': '0.0000',
    'store_credit_amount': '0.0000',
    'shipping_cost_inc_tax': '11.0000',
    'handling_cost_tax_class_id': 2,
    'currency_id': 1,
    'payment_status': 'captured',
    'subtotal_ex_tax': '99.0000',
    'total_inc_tax': '11.0000',
    'handling_cost_inc_tax': '0.0000',
    'total_ex_tax': '11.0000',
    'is_deleted': False,
    'status_id': 5,
    'id': 614534,
    'shipping_cost_ex_tax': '11.0000',
    'date_shipped': '',
    'order_source': 'www',
    'status': 'Cancelled',
    'handling_cost_tax': '0.0000',
    'items_total': 3,
    'wrapping_cost_tax': '0.0000',
    'date_created': 'Wed,
    09 Jul 2014 12:22:17 +0000',
    'total_tax': '0.0000',
    'order_is_digital': False,
    'date_modified': 'Thu,
    30 Oct 2014 02:34:07 +0000',
    'geoip_country': 'Australia',
    'base_shipping_cost': '11.0000',
    'payment_provider_id': '**************',
    'staff_notes': '',
    'default_currency_id': 1,
    'currency_code': 'AUD',
    'currency_exchange_rate': '1.0000000000',
    'coupon_discount': '99.0000',
    'customer_message': '',
    'subtotal_inc_tax': '99.0000',
    'gift_certificate_amount': '0.0000',
    'items_shipped': 0,
    'default_currency_code': 'AUD',
    'customer_id': 1,
    'geoip_country_iso2': 'AU',
    'ip_address': '124.168.160.136',
    'shipping_address_count': 1,
    'wrapping_cost_ex_tax': '0.0000',
    'base_handling_cost': '0.0000',
    'wrapping_cost_tax_class_id': 3,
    'ebay_order_id': '0',
    'wrapping_cost_inc_tax': '0.0000',
    'billing_address': {
        'state': '*******',
        'street_1': '*************',
        'street_2': '',
        'country_iso2': 'AU',
        'last_name': '************',
        'company': '***************',
        'country': 'Australia',
        'first_name': '*********',
        'email': '***************',
        'phone': '*************',
        'city': '*************',
        'zip': '************'
    },
    'subtotal_tax': '0.0000'
}

编辑:

def popAndMergeDicts(line):

    tempDict = line['billing_address']
    del line['billing_address']
    for i in tempDict:
        line[i] = tempDict[i]
    print(line)


def process_file(filename):
    lines = tuple(open(filename))

    for line in lines[0:1]:
        popAndMergeDicts(line)

process_file('allOrdersData')

allOrdersData是一个文件,我有很多字典,比如我之前发布的字典,每行一个。当我尝试运行它时出现以下错误:

TypeError:字符串索引必须是整数

编辑2:

没关系,让它与ast.literal_eval合作:

import ast


def popAndMergeDicts(line):

    dictLine = ast.literal_eval(line)
    tempDict = dictLine['billing_address']
    del dictLine['billing_address']
    for i in tempDict:
        dictLine[i] = tempDict[i]
    print(dictLine)


def process_file(filename):
    lines = tuple(open(filename))
    for line in lines[0:]:
        popAndMergeDicts(line)

process_file('allOrdersData')

5 个答案:

答案 0 :(得分:2)

只需使用.pop():它会返回弹出的值。例如,

#!/usr/bin/env python

import pprint

big_dict = {
    'shipping_cost_tax': '0.0000',
    'refunded_amount': '0.0000',
    #etc
    'billing_address': {
        'state': '*******',
        'street_1': '*************',
        'street_2': '',
        'country_iso2': 'AU',
        #etc
    },
    'subtotal_tax': '0.0000'
}

print 'Before'
pprint.pprint(big_dict, indent=4)

bill_dict = big_dict.pop('billing_address')

print '\nBill dict'
pprint.pprint(bill_dict, indent=4)

print '\nAfter'
pprint.pprint(big_dict, indent=4)

<强>输出

Before
{   'billing_address': {   'country_iso2': 'AU',
                           'state': '*******',
                           'street_1': '*************',
                           'street_2': ''},
    'refunded_amount': '0.0000',
    'shipping_cost_tax': '0.0000',
    'subtotal_tax': '0.0000'}

Bill dict
{   'country_iso2': 'AU',
    'state': '*******',
    'street_1': '*************',
    'street_2': ''}

After
{   'refunded_amount': '0.0000',
    'shipping_cost_tax': '0.0000',
    'subtotal_tax': '0.0000'}

要将键/值保留在原始字典中,而不是创建新字典,您可以执行Marichyasana建议:

bill_dict = big_dict.pop('billing_address')
for k in bill_dict:
    big_dict[k] = bill_dict[k]
del bill_dict

print '\nAfter'
pprint.pprint(big_dict, indent=4)

输出

After
{   'country_iso2': 'AU',
    'refunded_amount': '0.0000',
    'shipping_cost_tax': '0.0000',
    'state': '*******',
    'street_1': '*************',
    'street_2': '',
    'subtotal_tax': '0.0000'}

我还删除了临时bill_dict。这不是绝对必要的,因为bill_dict一旦超出范围就会被自动删除。

答案 1 :(得分:1)

如果你只想引用&#34;子词典&#34;,你可以简单地使用(d是你的原始字典):

billing1 = d['billing_address']

如果您需要独特的单独副本,可以使用以下任何一种方法:

billing2 = dict(d['billing_address'])
billing3 = d['billing_address'].copy()
billing4 = copy.copy(d['billing_address'])  # after import copy

billing1中值的更改将反映在原始字典中。对其他三个中的值的更改不会反映在原始字典中。

如果您还想删除billing_address密钥(就像您在问题中建议但在评论中进行了后退),请先使用上述方法之一,然后执行以下操作:

del d['billing_address']

或者,作为一步,如果您承诺从原始字典中删除密钥,请使用dict.pop()

billing5 = d.pop('billing_address')

答案 2 :(得分:1)

让&#39; a&#39;是字典的名称
让我们来看看&#39;是billing_address字典的名称

b=a['billing_address']
del a['billing_address']
for i in b:
    a[i]=b[i]

答案 3 :(得分:0)

ans = {key:val for key, val in input_dict.pop('billing_address').items()}

答案 4 :(得分:-1)

dict1 = {'shipping_cost_tax': '0.0000', 'refunded_amount': '0.0000', 'external_source': None, 'discount_amount': '0.0000', 'base_wrapping_cost': '0.0000', 'shipping_cost_tax_class_id': 2, 'payment_method': 'PayPal', 'handling_cost_ex_tax': '0.0000', 'store_credit_amount': '0.0000', 'shipping_cost_inc_tax': '11.0000', 'handling_cost_tax_class_id': 2, 'currency_id': 1, 'payment_status': 'captured', 'subtotal_ex_tax': '99.0000', 'total_inc_tax': '11.0000', 'handling_cost_inc_tax': '0.0000', 'total_ex_tax': '11.0000', 'is_deleted': False, 'status_id': 5, 'id': 614534, 'shipping_cost_ex_tax': '11.0000', 'date_shipped': '', 'order_source': 'www', 'status': 'Cancelled', 'handling_cost_tax': '0.0000', 'items_total': 3, 'wrapping_cost_tax': '0.0000', 'date_created': 'Wed, 09 Jul 2014 12:22:17 +0000', 'total_tax': '0.0000', 'order_is_digital': False, 'date_modified': 'Thu, 30 Oct 2014 02:34:07 +0000', 'geoip_country': 'Australia', 'base_shipping_cost': '11.0000', 'payment_provider_id': '**************', 'staff_notes': '', 'default_currency_id': 1, 'currency_code': 'AUD', 'currency_exchange_rate': '1.0000000000', 'coupon_discount': '99.0000', 'customer_message': '', 'subtotal_inc_tax': '99.0000', 'gift_certificate_amount': '0.0000', 'items_shipped': 0, 'default_currency_code': 'AUD', 'customer_id': 1, 'geoip_country_iso2': 'AU', 'ip_address': '124.168.160.136', 'shipping_address_count': 1, 'wrapping_cost_ex_tax': '0.0000', 'base_handling_cost': '0.0000', 'wrapping_cost_tax_class_id': 3, 'ebay_order_id': '0', 'wrapping_cost_inc_tax': '0.0000', 'billing_address': {'state': '*******', 'street_1': '*************', 'street_2': '', 'country_iso2': 'AU', 'last_name': '************', 'company': '***************', 'country': 'Australia', 'first_name': '*********', 'email': '***************', 'phone': '*************', 'city': '*************', 'zip': '************'}, 'subtotal_tax': '0.0000'}

print {'billing_address': dict1['billing_address']}